现象
org.springframework.beans.factory.BeanNotOfRequiredTypeException: Bean named ‘xxxxImpl‘ is expected to be of type ‘com.xxx.xxxImpl‘ but was actually of type ‘com.sun.proxy.$Proxy62‘
直接Autowired一个实现类,而不是接口
@Autowired
private XxxServiceImpl xxxService;
解决方案
1. Autowired接口
2. 使用EnableAspectJAutoProxy
SpringBootApplication @EnableAspectJAutoProxy(proxyTargetClass = true) public class Application { public static void main(String[] args) { SpringApplication app = new SpringApplication(Application.class); app.run(args); } }
设置proxy-target-class为true即使用cglib的方式代理对象,默认是jdk方式代理。
jdk的动态代理不支持类注入,只支持接口方式注入。
动态代理类型判断
//org.springframework.aop.framework.DefaultAopProxyFactory //参数AdvisedSupport 是Spring AOP配置相关类 public AopProxy createAopProxy(AdvisedSupport advisedSupport) throws AopConfigException { //在此判断使用JDK动态代理还是CGLIB代理 if (advisedSupport.isOptimize() || advisedSupport.isProxyTargetClass() || hasNoUserSuppliedProxyInterfaces(advisedSupport)) { if (!cglibAvailable) { throw new AopConfigException( "Cannot proxy target class because CGLIB2 is not available. " + "Add CGLIB to the class path or specify proxy interfaces."); } return CglibProxyFactory.createCglibProxy(advisedSupport); } else { return new JdkDynamicAopProxy(advisedSupport); } }