一、背景
今天在写代码时,有一个类:
public class StoreInfoTool{
@Resource
QAAssistantTool qaAssistantTool;
public void run(){
qaAssistantTool.search(xx);
}
}
执行时报错,提示qaAssistantTool为空。
然后就发现很奇怪,qaAssistantTool为什么注入失败了,在专门测试QAAssistantTool的用例里面,qaAssistantTool明明是成功的。
接着查看StoreInfoTool的实例,是由new生成的,也就是说不是由spring管理的实例。
结论:Spring中new对象时注解失败。
二、原理剖析
参考:
https://www.cnblogs.com/xbq8080/p/spring.html
spring创建对象是在类加载时就已经通过spring容器创建成功了,用new关键字new出来的对象,jvm会重新分配对应的空间和指针。
这完全就不受spring管理,所以spring管理的任何其他的东西你就拿不到,也就会报NullPointerException错误,所以在此时一旦自行new,所有的相应主入即会失效,在使用时就产生了冲突。
注意,这里并不是说使用了注解以后就不能new,测试结果是:能实例化,并且相应的方法也是可以使用的。但是,实例化后相应Class相关的注入也就会集体失效,除非你所有步骤都用new的方式,否则它还是会报错。
至于正确的解决方案,使用了注解,就别使用new,二者不可兼得。