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”/>

改为接口类型后:

http://fuhuijun.iteye.com/blog/2253741

JDK动态代理和CGLIB代理的区别

Spring中AOP的两种代理方式(Java动态代理和CGLIB代理)