springboot中@Autowired 注入失效的四种原因及解决方法

1. 被注入的对象没有加载到spring容器中

通常是因为被注入的对象没有被spring扫描到,此时需要添加对应的包扫描路径。

添加包扫描
在启动类中定义分别扫描两个包 ,即在@SpringBootApplication注解的类中添加:
@ComponentScan({“com.demo.test1”,“com.demo.common”})

2. 需要自动注入的对象不是spring加载,而是new的方式创建

由于对象不是spring创建的,当然spring也就无法根据注解自动注入对应的实例对象。

此时可以采用代码的方式,从spring容器中获取对象实例

通过Spring上下文工具类获取bean

    定义一个SpringUtil类

/**
 * Spring上下文工具类,用以让普通类获取Spring容器中的Bean
 */
@Component
public class SpringUtil implements ApplicationContextAware {
 
    private static ApplicationContext applicationContext = null;
    
    //获取applicationContext
    public static ApplicationContext getApplicationContext() {
        return applicationContext;
    }
 
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        if (SpringUtil.applicationContext == null) {
            SpringUtil.applicationContext = applicationContext;
        }
    }
    
    //通过name获取 Bean     
    public static Object getBean(String name) {
        return getApplicationContext().getBean(name);
    }
}

然后在类A中通过如下调用获取Spring容器中的实例


3. 需要自动注入的对象不是spring加载,而是采用反射的方式创建

这种情况和第二种情况类似,通常在一些框架调用的时候,采用的对象创建方式,为了避免对spring的依赖,采用类的反射方式进行创建。

此时可以采用代码的方式,从spring容器中获取对象实例。
方法和第二种情况相同。

4. 使用springboot的devtools热部署加载的类

热部署加载的类使用的加载器和spring容器的加载器不同,所以热部署加载器加载的类,访问不到spring容器中的对象。

这种情况通常发生在使用热部署过程中,禁用热部署后该问题就不存在了。

  • 6
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值