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

2022-09-01 21:45:03

我曾经在Spring Bean中初始化类属性。现在我看到这个任务可以通过Java内置的静态和非静态初始值设定项来完成。我不能用初始值设定项块做什么?afterPropertiesSet()afterPropertiesSet()


答案 1

给定以下类

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@PostConstructInitializingBean


答案 2

推荐