定制小程序开发使用@Autowired注解获取对象为null的几种情况

情况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) {     	// ....    }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

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

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

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

解决方法

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

@Componentpublic 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);    }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

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

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

网站建设定制开发 软件系统开发定制 定制软件开发 软件开发定制 定制app开发 app开发定制 app开发定制公司 电商商城定制开发 定制小程序开发 定制开发小程序 客户管理系统开发定制 定制网站 定制开发 crm开发定制 开发公司 小程序开发定制 定制软件 收款定制开发 企业网站定制开发 定制化开发 android系统定制开发 定制小程序开发费用 定制设计 专注app软件定制开发 软件开发定制定制 知名网站建设定制 软件定制开发供应商 应用系统定制开发 软件系统定制开发 企业管理系统定制开发 系统定制开发