首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Spring:当InitializingBean中有静态和非静态初始化器时,为什么需要Java的afterPropertiesSet()?

Spring:当InitializingBean中有静态和非静态初始化器时,为什么需要Java的afterPropertiesSet()?
EN

Stack Overflow用户
提问于 2015-06-09 15:58:55
回答 1查看 50K关注 0票数 23

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-09 16:27:51

给定以下类

代码语言:javascript
复制
public class MyClass implements InitializingBean {

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

    public void afterPropertiesSet() throws Exception { ... }
}

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

非静态初始化器块是在构造对象时,但在注入任何属性之前。实际将非静态初始值设定项块复制到构造函数。

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

另请参阅Static Initialization Blockshttp://docs.oracle.com/javase/tutorial/java/javaOO/initial.html

在创建类的实例并设置所有属性之后,将调用带注释的afterPropertiesSet@PostConstruct方法。例如,如果你想要预加载一些数据,这些数据可以在这个方法中完成,因为所有的依赖项都已经设置好了。

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

票数 62
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30726189

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档