基于Spring注入为Null的原因及解决方案

解决方法用到@PostConstruct注解,平常没接触过,写博客记录一下。

场景

在使用Aviator时需要自定义函数,但是在使用自定函数的时候发现@Resource注入的类是null,使用的框架是springboot所以没什么好配置的,在网上找了下原因,找到其中一个“在spring中如果使用new创建一个对象时,这个对象将不在受spring管理器管理”的博客,所以检查了下自己是否使用new方式管理bean。

经检查找出原因

3BE7EE10-2EB8-0D14-7EFA-1A7F03E63FDA.png

在项目启动时我用了静态块用new方式管理了bean。

但是使用静态块必须使用静态变量,而spring无法注入静态变量(有方法可以实现,但是比较麻烦)。

解决方法

将静态块改造成方法,并且使用注入方式传入对象,然后使用@PostConstruct注解,在将在依赖注入完成后,自动执行被注解的方法,这样就达到了启动项目注册函数的效果。

BE1C23FF-51A7-D093-E640-8E85C8B86438.png

@PostConstruct:

被@PostConstruct修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器执行一次。PostConstruct在构造函数之后执行,init()方法之前执行。

参考资料

https://cloud.tencent.com/developer/article/1371264

比较了构造器、@PostConstruct、@Autowired的加载顺序

https://www.jianshu.com/p/98cf7d8b9ec3

@PostConstruct和@PreDestroy的详细解析

收藏 (0)
评论列表
正在载入评论列表...
我是有底线的
为您推荐
    暂时没有数据