aop代理方式引起的spring注入bean(实现类)与获取bean(实现类)出错
描述:
现象一 :A 为 接口,AImpl 为 A 的实现类,且 AImpl 受 aop 扫描,且 aop 无特殊配置
此时若:Spring 中 注入 AImpl 类型的bean,获取一样 报错
Spring 中 注入 A 类型的bean ,获取一样 成功
现象二 :B 没有实现接口,B受 aop 扫描,且 aop无特殊配置
此时若:Spring 中 注入 B 类型的bean,获取一样 成功
分析:
1、如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP
2、如果目标对象实现了接口,可以强制使用CGLIB实现AOP
3、如果目标对象没有实现了接口,必须采用CGLIB库,spring会自动在JDK动态代理和CGLIB之间转换
现象一 :因为 AImpl 实现了 A 接口,所有自动使用了JDK proxy ,而JDK proxy 实现原理基于接口生成代理对象(详见下边链接)
代理对象 类型不同于 AImpl ,所以报错
JDK proxy 生成的代理对象也实现了A 接口,so 接口类型可以。
现象二 :B 没有实现接口,故spring 采用 cglib 实现动态代理,其原理是生成子类(详见下边链接)
so , 成功注入与获取。
解决:
Spring 中添加配置 <aop:aspectj-autoproxy proxy-target-class="true"/>
参考:
http://fuhuijun.iteye.com/blog/2253741
Spring中AOP的两种代理方式(Java动态代理和CGLIB代理)