aop代理方式引起的spring注入bean(实现类)与获取bean(实现类)出错
1、如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP
2、如果目标对象实现了接口,可以强制使用CGLIB实现AOP
3、如果目标对象没有实现了接口,必须采用CGLIB库,spring会自动在JDK动态代理和CGLIB之间转换
因为 AImpl 实现了 A 接口,所有自动使用了JDK proxy ,而JDK proxy 实现原理基于接口生成代理对象,代理对象类型不同于 AImpl ,所以报错,JDK proxy 生成的代理对象也实现了A 接口,所以接口类型可以。其中jdk的实现是有其局限性的,既只有实现接口的类才能使用jdk的方式来作代理。而cglib则补足了jdk的不足,他允许创建一个无接口实现的类的代理类。
所以在使用Aop的时候可以强行使用cglib实现,配置aop:
<aop:aspectj-autoproxy proxy-target-class=“true”/>
改为接口类型后: