springboot Autowired BeanNotOfRequiredTypeException

简介: 现象 org.springframework.beans.factory.BeanNotOfRequiredTypeException: Bean named 'xxxxImpl' is expected to be of type 'com.

现象

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);     
  
    }     
  
}  

 

目录
相关文章
|
设计模式 Java 测试技术
大公司为什么禁止在SpringBoot项目中使用@Autowired注解?
Spring官方已不推荐使用Autowired字段/属性注入bean,,一些大公司的新项目也明令禁止使用了。 1. 说明 最近公司升级框架,由原来的spring framerwork 3.0升级到5.0,然后写代码的时候突然发现idea在属性注入的@Autowired注解上给出警告提示,就像下面这样的,也挺懵逼的,毕竟这么写也很多年了。
|
Java Spring 容器
springboot 静态方法中使用@Autowired注入配置和Bean
springboot 静态方法中使用@Autowired注入配置和Bean
|
Java Spring
Idea spring boot cannot autowired 解决方法
Idea spring boot cannot autowired 解决方法
145 0
|
Java Spring
SpringBoot 中- HandlerInterceptor 中 @Autowired 和 @Resource 为空
SpringBoot 中- HandlerInterceptor 中 @Autowired 和 @Resource 为空
118 0
|
人工智能 Java 测试技术
解决SpringBoot 测试类无法自动注入@Autowired的问题
解决SpringBoot 测试类无法自动注入@Autowired的问题
|
Java Spring 容器
SpringBoot使用@Autowired注入静态变量报空指针异常
类变量(用static修饰)是属于类的,在spring容器中都是实例化对象。当我们使用静态变量或静态方法时,不需要new出来一个类的实例化对象,所以使用@Autowired修饰一个静态变量时,该静态变量并没有真正实例化成一个对象,因此该静态变量为null,不能使用 @Autowired来注入静态变量。
977 0
|
Java
问题解决:Springboot项目或者SSM项目中使用@Autowired注解时,出现红色波浪线报错问题解决
问题解决:Springboot项目或者SSM项目中使用@Autowired注解时,出现红色波浪线报错问题解决
513 0
问题解决:Springboot项目或者SSM项目中使用@Autowired注解时,出现红色波浪线报错问题解决
|
开发框架 Java Spring
Springboot @Autowired 和 @Resource 我的剖析,你看完就不会忘
Springboot @Autowired 和 @Resource 我的剖析,你看完就不会忘
455 0
Springboot @Autowired 和 @Resource 我的剖析,你看完就不会忘
|
SQL 前端开发 安全
SpringBoot项目使用多线程处理任务时无法通过Autowired注入bean
  最近在做一个“温湿度控制”的项目,项目要求通过用户设定的温湿度数值和实时采集到的数值进行比对分析,因为数据的对比与分析是一个通过前端页面控制的定时任务,经理要求在用户开启定时任务时,单独开启一个线程进行数据的对比分析,并将采集到的温湿度数值存入数据库中的历史数据表,按照我们正常的逻辑应该是用户在请求开启定时任务时,前端页面通过调用后端接口,创建一个新的线程来执行定时任务,然后在线程类中使用 @Autowired 注解注入保存历史数据的service层,在线程类中调用service层保存历史数据的方法实现温湿度数据的保存,这时就出现了一个很尴尬的问题,在新开启的线程中使用 @Autowire
327 0