实现aop的方式有很多,这里仅对最后一种进行说明。
一、 JDK动态代理
jdk动态代理必须借助一个接口才能产生代理对象。因此,对于使用业务接口的类,spring默认使用jdk动态代理实现AOP。
创建的代理类实现InvocationHandler接口
二、CGLIB动态代理
CGLIB动态代理不需提供接口。因此,对于没有接口的类,使用CGLIB动态代理实现AOP。仅依赖Spring-Core包。
创建的代理类实现MethodInterceptor接口
三、基于代理类的AOP实现
四、基于XML配置开发AspectJ
和第五种一样,只不过一个是xml形式,一个是注解形式
五、基于注解开发AspectJ(推荐)
1,创建切面类。
自定义各种通知方法和切入点方法
各种方法上加相应注解,类上加相应注解。
2,配置文件:
启动基于注解的AspectJ支持
注:
无异常:环绕-前置-方法-后置返回-最终-环绕
有异常:环绕-前置-方法-异常-最终
注:编写环绕通知时,
1、ProceedingJoinPoint是JoinPoint的子接口,代表可以执行的目标方法
2、返回值的类型必须是Object
3、必须一个参数是类型ProceedingJoinPoint
4、必须throws Throwable
执行顺序是我亲自测的结果。网上及书籍上,执行顺序都不完全一样。有兴趣可以自测试试。如我有误,麻烦告诉我一下,谢谢。
注:引入通知(该通知可在目标类中增加一些新的方法和属性等操作)。
在切面类中加入下面代码。
/**
* aop.dao.*包下的所有实现类都添加了MaxCalculatorImpl类的方法。
* 如果用aop.dao.Calculator+表示Calculator接口的所有子类型(非Calculator本身)都添加了MaxCalculatorImpl类的方法。
* 如果用* *.PureCalculator(*空格*)表示PureCalculator类添加了MaxCalculatorImpl类的方法。
* 如果用aop.dao.PureCalculator表示PureCalculator类添加了MaxCalculatorImpl类的方法。
* 用* *.Calculator+也可,
*/
@DeclareParents(value = "* *.Calculator+", defaultImpl = MaxCalculatorImpl.class)
private MaxCalculator maxCalculator;
然后获得calculator的bean后,直接强转成MaxCalculator 类即可调用该类方法。
MaxCalculator calculator = (MaxCalculator) appCon.getBean(Calculator.class);