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

Ale*_*hel 12 java spring spring-mvc

我曾经习惯afterPropertiesSet()在Spring bean中初始化类属性.现在我看到这个任务可以通过Java的内置静态和非静态初始化器来完成.我能做些什么我afterPropertiesSet()不能使用初始化程序块?

M. *_*num 41

鉴于以下课程

public class MyClass implements InitializingBean {

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

    public void afterPropertiesSet() throws Exception { ... }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

另请参见静态初始化块http://docs.oracle.com/javase/tutorial/java/javaOO/initial.html

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

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

  • 彻底_和_切实回答 - 现在有一些你每天都看不到的东西. (4认同)