spring管理的bean在静态方法使用技巧——@PostConstruct

问题:

        如果我们使用正常的 @Component 注解将一个类交由spring管理,然后在使用的时候用@Resource注入对象,在没有碰到静态方法的时候,是不会出现问题,但是如果出现了静态方法,这样的使用方法就会出现空指针的异常,也就是你@Resource注入的对象是空


原因:

        一个方法或者变量被 static 修饰,则说明改方法或者变量就成为了类方法或者变量,随着类的加载而加载,会被当前类下的所有对象所共有。而@Resource的作用,就是去springbean工厂中去匹配一个对象,并且完成对象的注入,这属于对象级别的,在此时,类的所有静态属性已经被加载完成

        问题产生的原因就是类加载的先后顺序导致的,静态属性会在程序第一次启动的时候,就完成加载,并且之后不会再有变动,但是使用@Resource注解,则是每次都去spring容器去获取bean,在静态变量初始化的后面,所有就会导致@Resource出现空的情况


解决方案:

        这里我们要学习一个注解 @PostConstruct

        在Spring Boot项目中,@PostConstruct注解用于标记一个方法,该方法在类实例化后被调用,在依赖注入完成之后执行。它的作用是在对象创建后执行一些初始化操作

        具体来说,@PostConstruct注解通常与依赖注入结合使用,用于在注入依赖之后执行一些必要的初始化任务。当Spring容器实例化一个带有@PostConstruct注解的Bean时,它会在所有依赖注入完成之后调用被注解的方法。

因此,如果我们想要在静态方法中使用一个 spring管理的bean,如下:

@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属性。

猜你喜欢

转载自blog.csdn.net/weixin_73077810/article/details/132623984