增强类型
Spring支持5种类型的增强,按照增强在目标类方法的连接点位置,可以分为以下5类。
前置增强:
后置增强:
环绕增强:
异常抛出增强:
前置增强
场景:实习服务生,对客户的问候:
以上就是我们的业务类;
下面编写我们的切面,实现类
测试类实现,采用TestNG:
采用XMLApplicationContext 进行配置,动态代理;
测试类实现:
ProxyFactoryBean负责为其他Bean创建代理实例,它内部使用ProxyFactory来完成这一工作。下面进一步了解ProxyFactoryBean几个常用的可配置属性。
1) targer:代理目标对象;
2) proxyInterfaces:代理所要实现的接口,可以多个接口。该属性还有一个别名属性interfaces。
3) interceptorNames:需要植入目标对象的bean列表,采用Bean的名称指定。这些Bean必须是实现org.aopalliance.intercept.MethodInterceptor或org.springframework.aop.Advisor的Bean,配置中得顺序对应调用顺序。
4) singleton:返回的代理是否是单例,默认为单例。
5) optimize:当设置为true 时,强制使用cglib 代理。对于singleton 的代理,推荐使用cglib,对于其他作用域类型的代理,最好使用JDK代理(基于接口)。原因是cglib创建代理时速度慢,但创建出的代理对象运行效率高,而使用JDK代理的表现正好相反。
6) proxyTargetClass:是否对类进行代理(而不是对接口进行代理),设置为true时,使用cglib代理。
后置增强
同上,后置增强只要实现AfterReturningAdvice 接口就可以了;
修改一些配置beans.xml:
运行结果:
环绕增强
环绕增强其实是前、后置增强的一个综合体;它允许在目标类方法调用前、后织入横切逻辑;他的实现更前、后置增强的实现也大同小异,他要实现一个Methodinterceptor 接口。
环绕增强如下:
添加环绕增强配置beans.xml:
只是实现接口不一样,其他基本雷同;
异常抛出增强
适合场景:事务管理,当参与事务的某个Dao发生异常时,事务管理器就必须回滚事务。
下面,我们就采用事务管理作为例子:
下面写一个基本业务:
异常增强类如下:
必须采用以下签名形式定义异常抛出的增强方法。
Void afterThrowing([Method method , Object[ ] args, Object targer] , Throwable );
前面三个参数是可选的,后面的异常处理是必须的。它的入参可以是Throwable 或其子类。如下方法都是合法的:
afterThrowing(SQLException e);//数据库处理异常。
afterThrowing(RuntimeExceptione);//运行异常。
afterTrowing(Methodmethod, Object[] args, Object target , RuntimeException e);
使用那一个异常处理方法,spring反射的机制自动判断。
测试类如下: