我已经使用afterPropertiesSet()在Spring bean中初始化类属性。现在,我看到可以通过Java的内置静态和非静态初始化程序来完成此任务。我不能使用初始化程序块处理的afterPropertiesSet()怎么办?

最佳答案

鉴于以下类(class)

public class MyClass implements InitializingBean {

    static { ... } // static initializer
    { ... }  // non-static initializer

    public void afterPropertiesSet() throws Exception { ... }
}

静态初始化程序初始化程序块仅在由类加载器加载类时执行。那时没有该类的实例,并且此时您只能访问类级别的变量(static),而不能访问实例变量。

非静态初始化程序块是在构造对象时但在注入(inject)任何属性之前。非静态初始化程序块实际上已复制到构造函数。



另请参见Static Initialization Blockshttp://docs.oracle.com/javase/tutorial/java/javaOO/initial.html

创建了类的实例并设置了所有属性后,将调用afterPropertiesSet@PostConstruct带注释的方法。例如,如果您想预加载一些可以在此方法中完成的数据,因为已经设置了所有依赖项。

如果只有强制性依赖项,则最好使用构造函数注入(inject),而不是使用InitializingBean@PostConstruct将初始化逻辑放入构造函数中。仅当所有依赖项都通过构造函数注入(inject)时才有效,如果您通过set方法设置了可选的依赖项,则只能选择使用@PostConstructInitializingBean

09-10 08:04
查看更多