关于spring注解失败的问题

本文探讨了在Spring框架中,当在Controller层通过new Thread启动线程并调用未被Spring管理的类时,@Autowired注解失效的问题。详细分析了原因,并提供了解决方案:通过实现ApplicationContextAware接口来获取ApplicationContext容器,从而手动注入所需的bean。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前几天遇到一个问题就是关于spring注解 @Autowired注解失败问题。
场景:在controller层直接调用处理逻辑的类(Demo.java代表)我在controller层新起线程 new Thread(new Demo()).start 。这样就出现问题了。Demo.java的autowired注解注入失败,会报一个NullpointException.
原因分析:由于controller层是new出来的对象,不是交给spring进行管理的。而在Demo.java进行注入的是spring进行管理的。两者关联不在一起,所有会报空指针,找不到注入的类。

下面提供一种我的解决方法。
取消注解方式,了解spring源码的都知道 ApplicationContextAware会在bean初始化之后拿到所有的bean资源。我们可以写一个类去实现 ApplicationContextAware这个接口,获得ApplicationContext容器。然后从容器里获取bean,可以根据bean的name 或者class。
代码如下:
在这里插入图片描述
得到 ApplicationContext 有很多方法:
context.getBean(要注入的类);
然后把你定义的这个类加入到spring容器中。这个比较好理解 就是让spring容器初始化的时候加载一下你的这个类 我定义的类名是SpringApplicationUtil 在spring里配置下这个类就可以了。
<bean class="路径/SpringApplicationUtil />

然后就可以获取到这类了。

欢迎大家提出自己的见解,有问题及时交流。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值