当我们已经有自定义的@Bean(initMethod = "init")
或@PostConstruct
时,为什么需要InitializingBean
的afterPropertiesSet
?一种方法可以完成哪些操作而另一种方法不能完成哪些操作?何时应该使用一种而不是另一种?所有这些都是在自动装配所有属性之后触发的回调。
通常情况下,如果一个bean实现了InitializingBean
接口,则首先调用@PostConstruct
,然后是afterPropertiesSet
,最后是init-method
。
@PostConstruct
是一个JSR-250
注解,而init-method
和InitializingBean
是Spring框架用于bean初始化的工具。
InitializingBean vs. init-method
在Spring工具init-method
和destroy-method
之间做出选择是推荐的方法,因为它们没有直接依赖于Spring框架,我们可以创建自己的方法。 通过init-method
,可以独立于Spring框架调用自定义方法,如果您决定使用其他框架,可以重用此方法。
PostConstruct vs. Spring tools
Spring文档清楚地解释了首选的初始化方式:
要与容器的bean生命周期管理进行交互,可以实现Spring的
在初始化和销毁bean时,使用JSR-250的@PostConstruct和@PreDestroy注解是现代Spring应用程序中接收生命周期回调的最佳实践。 使用这些注解意味着您的bean不会与Spring特定接口耦合。InitializingBean
和DisposableBean
接口。 对于前者,容器调用afterPropertiesSet()
,对于后者,容器调用destroy()
,以便允许bean执行某些
afterPropertiesSet
和init-method
之间的区别? - Ida AmitafterPropertiesSet
在init-method
之前调用,但这将会让一个 Bean 和 Spring Framework 紧密耦合。init-method
是一个独立于 Spring 的自定义方法,如果你决定采用其他框架,你仍然可以重用该方法。 - J-Alex@PostConstruct
是postProcessBeforeInitialization
阶段的一部分,而不是单独的操作。详细信息请参见https://dev59.com/gGoy5IYBdhLWcg3wfOF4。 - igor.zh