问题:
如果我们使用正常的 @Component 注解将一个类交由spring管理,然后在使用的时候用@Resource注入对象,在没有碰到静态方法的时候,是不会出现问题,但是如果出现了静态方法,这样的使用方法就会出现空指针的异常,也就是你@Resource注入的对象是空
原因:
一个方法或者变量被 static 修饰,则说明改方法或者变量就成为了类方法或者变量,随着类的加载而加载,会被当前类下的所有对象所共有。而@Resource的作用,就是去springbean工厂中去匹配一个对象,并且完成对象的注入,这属于对象级别的,在此时,类的所有静态属性已经被加载完成
问题产生的原因就是类加载的先后顺序导致的,静态属性会在程序第一次启动的时候,就完成加载,并且之后不会再有变动,但是使用@Resource注解,则是每次都去spring容器去获取bean,在静态变量初始化的后面,所有就会导致@Resource出现空的情况
解决方案:
这里我们要学习一个注解 @PostConstruct
在Spring Boot项目中,
@PostConstruct
注解用于标记一个方法,该方法在类实例化后被调用,在依赖注入完成之后执行。它的作用是在对象创建后执行一些初始化操作。具体来说,
@PostConstruct
注解通常与依赖注入结合使用,用于在注入依赖之后执行一些必要的初始化任务。当Spring容器实例化一个带有@PostConstruct
注解的Bean时,它会在所有依赖注入完成之后调用被注解的方法。
因此,如果我们想要在静态方法中使用一个 spring管理的bean,如下:文章来源:https://www.toymoban.com/news/detail-688668.html
@Component
public class FileUpload {
@Resource
private CommonConfig commonConfig;
private static FileUpload fileUpload;
@PostConstruct
public void init(){
fileUploadUtil = this;
fileUploadUtil.commonConfig= commonConfig;
}
public static void testSpring(){
fileUploadUtil.commonConfig.xxxx ; // 调用commonConfig
}
}
这段代码的作用是将
CommonConfig
对象注入到FileUploadUtil
类中,并在初始化过程中将其赋值给静态变量fileUploadUtil
,以便在其他地方可以通过静态变量访问FileUploadUtil
对象和commonConfig
属性。文章来源地址https://www.toymoban.com/news/detail-688668.html
到了这里,关于spring管理的bean在静态方法使用技巧——@PostConstruct的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!