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