项目中使用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"/>