Spring AOP的JDK代理与CGLIB代理

项目中使用AOP出现的一个错误:

org.springframework.beans.factory.UnsatisfiedDependencyException: 
Error creating bean with name 'com.pajk.apate.controller.DoctorControllerTest': 
Unsatisfied dependency expressed through field 'doctorController'; 
nested exception is org.springframework.beans.factory.BeanNotOfRequiredTypeException: 
Bean named 'doctorController' is expected to be of type 'com.demo.controller.DoctorController' 
but was actually of type 'com.sun.proxy.$Proxy110'

出现这个问题的原因是:
Spring AOP 默认使用JDK动态代理。如果业务对象未实现接口,则默认使用CGLIB代理。

If the target object to be proxied implements at least one interface then a JDK dynamic proxy will be used. All of the interfaces implemented by the target type will be proxied. If the target object does not implement any interfaces then a CGLIB proxy will be created.
如果要代理的目标对象实现至少一个接口,则将使用JDK动态代理。 目标类型实现的所有接口都将被代理。 如果目标对象未实现任何接口,则将创建CGLIB代理。
以上是Spring AOP官方文档:(更多官方文档参考我的另外一篇博客:面向切面的Spring编程(官方文档翻译))

因为DoctorController实现了一个日志接口,而Spring AOP采用了JDK动态代理,所以引发了这个异常。
解决方法:
如果不想删除这个日志接口,那么我们可以让Spring AOP强制使用CGLIB代理。

To force the use of CGLIB proxies set the value of the proxy-target-class attribute of the <aop:config> element to true:
要强制使用CGLIB代理,请将<aop:config>元素的proxy-target-class属性的值设置为true:

<aop:config proxy-target-class="true">
    <!-- other beans defined here... -->
</aop:config>

To force CGLIB proxying when using the@AspectJ autoproxy support, set the 'proxy-target-class' attribute of the <aop:aspectj-autoproxy> element to true:
要在使用@AspectJ 自动代理支持时强制CGLIB代理,请将<aop:aspectj-autoproxy>元素的'proxy-target-class'属性设置为true:

<aop:aspectj-autoproxy proxy-target-class="true"/>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值