我已经使用afterPropertiesSet()
初始化了Spring beans中的类属性。现在我看到这个任务可以通过Java内置的静态和非静态初始化器来完成。我可以用afterPropertiesSet()
做什么我不能用初始化程序块做的事情?
发布于 2015-06-09 16:27:51
给定以下类
public class MyClass implements InitializingBean {
static { ... } // static initializer
{ ... } // non-static initializer
public void afterPropertiesSet() throws Exception { ... }
}
只有在类加载器加载类时,才会执行静态初始化程序块。此时没有该类的实例,此时您只能访问类级(static
)变量,而不能访问实例变量。
非静态初始化器块是在构造对象时,但在注入任何属性之前。实际将非静态初始值设定项块复制到构造函数。
编译器将初始化器代码块复制到每个构造函数中。因此,此方法可用于在多个构造函数之间共享代码块。
另请参阅Static Initialization Blocks和http://docs.oracle.com/javase/tutorial/java/javaOO/initial.html
在创建类的实例并设置所有属性之后,将调用带注释的afterPropertiesSet
或@PostConstruct
方法。例如,如果你想要预加载一些数据,这些数据可以在这个方法中完成,因为所有的依赖项都已经设置好了。
如果只有强制依赖,那么最好使用构造函数注入,而不是使用InitializingBean
或@PostConstruct
,将初始化逻辑放在构造函数中。只有当所有依赖项都是通过构造函数注入时,这才能起作用,如果您有通过set方法设置的可选依赖项,那么您别无选择,只能使用@PostConstruct
或InitializingBean
。
https://stackoverflow.com/questions/30726189
复制相似问题