使用@Autowired注解获取对象为null的几种情况
短信预约 -IT技能 免费直播动态提醒
情况1:Bean对象并没有交给Spring管理
- 检查@Autowired的对象是否已经被注入到Spring容器中了;
- 确保使用@Autowired注解的对象也已存在Spring的容器中。
情况2:对象使用过new关键字
这是我遇到的情况,当一个对象使用过关键new时,它是不能被Spring所管理的。
所以如果在这些对象中使用@Autowired去注入对象,得到的结果也是为null。
就比如我在项目中遇到的情况:
@Slf4j@Componentpublic class MyCrawler extends WebCrawler {@Autowired private BookFeignService bookFeignSerivce; @Override public boolean shouldVisit(Page referringPage, WebURL url) {// .... } @Override public void visit(Page page) { // .... }}
该类继承了一个WebCrawler,其实就是一个第三方框架,在我执行某个功能的时候,这些被重写的方法就会被其内部自动调用。
在该类中使用@Autowired注入对象,就会看到注入的对象为null,尽管这些对象已经在Spring容器中存在了。
主要原因就是因为该类继承了一个第三方框架,在执行的过程中,它是被人家框架内部创建实例然后去调用的,这就导致了可能在内部new过这个对象了,所以就导致了@Component对这个类根本不起作用。
解决方法
那么,如果我们非要在该类中获取到Spring容器中的对象,应该怎么办?
写一个工具类:
@Componentpublic class MyBeanUtil implements ApplicationContextAware { protected static ApplicationContext applicationContext; @Override public void setApplicationContext(ApplicationContext app) throws BeansException { if (applicationContext == null) { applicationContext = app; } } public static <T> T getBean(Class<T> clazz) { return applicationContext.getBean(clazz); }}
通过getBean这个方法就可以获取到Spring容器中的对象了。
注意:该类一定要加@Component注解。
来源地址:https://blog.csdn.net/sunao1106/article/details/126752663
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341