Java使用@Autowired注解获取对象为null的几种情况及解决方法
情况1:Bean对象并没有交给Spring管理
- 检查@Autowired的对象是否已经被注入到Spring容器中了;
- 确保使用@Autowired注解的对象也已存在Spring的容器中。
情况2:对象使用过new关键字
这是我遇到的情况,当一个对象使用过关键new时,它是不能被Spring所管理的。
所以如果在这些对象中使用@Autowired去注入对象,得到的结果也是为null。
就比如我在项目中遇到的情况:
@Slf4j @Component public 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容器中的对象,应该怎么办?
写一个工具类:
@Component public class MyBeanUtil implements ApplicationContextAware { protected static ApplicationContext applicationContext; @Override public void setApplicationContext(ApplicationContext app) throws BeansException { if (applicationContext == null) { applicationContext = app; } } /** * 通过类的class从容器中手动获取对象 */ public static <T> T getBean(Class<T> clazz) { return applicationContext.getBean(clazz); } }
通过getBean这个方法就可以获取到Spring容器中的对象了。
注意:该类一定要加@Component注解。
到此这篇关于Java使用@Autowired注解获取对象为null的几种情况及解决方法的文章就介绍到这了,更多相关Java @Autowired获取对象为null内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
解决Maven项目中 Invalid bound statement 无效的绑定问题
这篇文章主要介绍了解决Maven项目中 Invalid bound statement 无效的绑定问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2021-06-06利用Spring Data MongoDB持久化文档数据的方法教程
这篇文章主要给大家介绍了关于利用Spring Data MongoDB持久化文档数据的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考借鉴,下面来一起看看吧。2017-08-08sqlserver和java将resultSet中的记录转换为学生对象
这篇文章主要介绍了如何利用sqlserver和java将resultSet中的记录转换为学生对象,附有超详细的代码,需要的朋友可以参考一下,希望对你有所帮助2021-12-12全面汇总SpringBoot和SpringClould常用注解
Java注解是附加在代码中的一些元信息,用于一些工具在编译、运行时进行解析和使用,起到说明、配置的功能,这篇文章就带你来了解一下2021-08-08
最新评论