前几天遇到一个问题就是关于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 />
然后就可以获取到这类了。
欢迎大家提出自己的见解,有问题及时交流。