0


使用@Autowired注解获取对象为null的几种情况

情况1:Bean对象并没有交给Spring管理

  • 检查@Autowired的对象是否已经被注入到Spring容器中了;
  • 确保使用@Autowired注解的对象也已存在Spring的容器中。

情况2:对象使用过new关键字

这是我遇到的情况,当一个对象使用过关键new时,它是不能被Spring所管理的。

所以如果在这些对象中使用@Autowired去注入对象,得到的结果也是为null。

就比如我在项目中遇到的情况:

@Slf4j@ComponentpublicclassMyCrawlerextendsWebCrawler{@AutowiredprivateBookFeignService bookFeignSerivce;@OverridepublicbooleanshouldVisit(Page referringPage,WebURL url){// ....}@Overridepublicvoidvisit(Page page){// ....}}

该类继承了一个WebCrawler,其实就是一个第三方框架,在我执行某个功能的时候,这些被重写的方法就会被其内部自动调用。

在该类中使用@Autowired注入对象,就会看到注入的对象为null,尽管这些对象已经在Spring容器中存在了。

主要原因就是因为该类继承了一个第三方框架,在执行的过程中,它是被人家框架内部创建实例然后去调用的,这就导致了可能在内部new过这个对象了,所以就导致了@Component对这个类根本不起作用。

解决方法

那么,如果我们非要在该类中获取到Spring容器中的对象,应该怎么办?
写一个工具类:

@ComponentpublicclassMyBeanUtilimplementsApplicationContextAware{protectedstaticApplicationContext applicationContext;@OverridepublicvoidsetApplicationContext(ApplicationContext app)throwsBeansException{if(applicationContext ==null){
            applicationContext = app;}}/**
     * 通过类的class从容器中手动获取对象
     */publicstatic<T>TgetBean(Class<T> clazz){return applicationContext.getBean(clazz);}}

通过getBean这个方法就可以获取到Spring容器中的对象了。

注意:该类一定要加@Component注解。

标签: java spring spring boot

本文转载自: https://blog.csdn.net/sunao1106/article/details/126752663
版权归原作者 小孙的Blog 所有, 如有侵权,请联系我们删除。

“使用@Autowired注解获取对象为null的几种情况”的评论:

还没有评论