Spring:为什么在Java中存在静态和非静态初始值设定项时需要InitializingBean的afterPropertiesSet()?

时间:2015-06-09 07:58:55

标签: java spring spring-mvc

我使用afterPropertiesSet()来初始化Spring bean中的类属性。现在我看到这个任务可以通过Java的内置静态和非静态初始化器来完成。对于afterPropertiesSet(),我无法使用初始化程序块进行哪些操作?

1 个答案:

答案 0 :(得分:35)

给出以下课程

public class MyClass implements InitializingBean {

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

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

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

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

  

Java编译器将初始化程序块复制到每个构造函数中。因此,这种方法可用于在多个构造函数之间共享代码块。

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

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

如果您只有强制依赖项,那么最好使用构造函数注入,而不是使用InitializingBean@PostConstruct将初始化逻辑放在构造函数中。这只有在通过构造函数注入所有依赖项时才有效,如果你有set方法设置的可选依赖项,那么你别无选择,只能使用@PostConstructInitializingBean