我曾经afterPropertiesSet()在Spring bean中初始化类属性。现在,我看到可以通过Java的内置静态和非静态初始化程序来完成此任务。afterPropertiesSet()我不能使用初始化程序块来做什么?
afterPropertiesSet()
鉴于以下课程
public class MyClass implements InitializingBean { static { ... } // static initializer { ... } // non-static initializer public void afterPropertiesSet() throws Exception { ... } }
的 静态 初始化代码块时,类是由类加载器加载时才执行。那时该类没有实例,您此时只能访问类级别(static)变量,而不能访问实例变量。
static
的 非静态 初始化块是在构造对象,但任何属性被注入之前时。非静态初始化程序块实际上已复制到构造函数。
Java编译器将初始化程序块复制到每个构造函数中。因此,该方法可用于在多个构造函数之间共享代码块。
另请参见静态初始化块和http://docs.oracle.com/javase/tutorial/java/javaOO/initial.html
该afterPropertiesSet或@PostConstruct创建类的实例后,标注的方法被调用,所有的属性已设置。例如,如果您想预加载一些可以在此方法中完成的数据,因为已经设置了所有依赖项。
afterPropertiesSet
@PostConstruct
如果仅具有强制性依赖关系,则最好使用构造函数注入,而不要在构造函数中使用InitializingBean或@PostConstruct放置初始化逻辑。仅当所有依赖项都通过构造函数注入时才有效,如果您通过set方法设置了可选的依赖项,则只能使用@PostConstruct或InitializingBean。
InitializingBean