所有基于配置文件的aspect只支持singleton模式
在aop:config标签中添加 proxy-target-class="true" 即可改变AOP实现方式。(默认值为false)
高版本spring自动根据运行类选择JDK或CGLIB代理,我们无需设置proxy-target-class属性,JDK动态代理是模拟接口实现的方式,cglib是模拟子类继承的方式,一般采用前者,因为前者效率高。后者不建议使用。
使用cglib需要两个jar包:asm.jar和cglib.jar
(不知为何,实际开发中业务对象实现了接口反而必须用cglib,不知道哪里出了问题)
AOP例子:
对应配置文件:
before advice,只在进入方法之前被调用,可以在连接点执行之前插入自定义行为,但不能改变返回值
throws advice,如果连接点抛出异常,throws advice在连接点返回后被调用;如果throws advice的方法抛出异常,那么它将覆盖原有异常
after returning advice,可以访问连接点返回值(但不能修改)、被调用的方法、方法的参数和目标;如果抛出异常将会跑出拦截器链,替代返回值
introduction advice,spring把引入通知作为一种特殊的拦截通知,适用于类,不能和切入点一起使用