Spring:当我们已经有自定义的init()或@PostConstruct时,为什么还需要InitializingBean的afterPropertiesSet方法?

6

当我们已经有自定义的@Bean(initMethod = "init")@PostConstruct时,为什么需要InitializingBeanafterPropertiesSet?一种方法可以完成哪些操作而另一种方法不能完成哪些操作?何时应该使用一种而不是另一种?所有这些都是在自动装配所有属性之后触发的回调。

1个回答

29

通常情况下,如果一个bean实现了InitializingBean接口,则首先调用@PostConstruct,然后是afterPropertiesSet,最后是init-method

Spring bean生命周期

@PostConstruct是一个JSR-250注解,而init-methodInitializingBean是Spring框架用于bean初始化的工具。

InitializingBean vs. init-method

在Spring工具init-methoddestroy-method之间做出选择是推荐的方法,因为它们没有直接依赖于Spring框架,我们可以创建自己的方法。 通过init-method,可以独立于Spring框架调用自定义方法,如果您决定使用其他框架,可以重用此方法。

PostConstruct vs. Spring tools

Spring文档清楚地解释了首选的初始化方式:

要与容器的bean生命周期管理进行交互,可以实现Spring的InitializingBeanDisposableBean接口。 对于前者,容器调用afterPropertiesSet(),对于后者,容器调用destroy(),以便允许bean执行某些

在初始化和销毁bean时,使用JSR-250的@PostConstruct和@PreDestroy注解是现代Spring应用程序中接收生命周期回调的最佳实践。 使用这些注解意味着您的bean不会与Spring特定接口耦合。

2
请问您能否澄清afterPropertiesSetinit-method之间的区别? - Ida Amit
首先,afterPropertiesSetinit-method 之前调用,但这将会让一个 Bean 和 Spring Framework 紧密耦合。init-method 是一个独立于 Spring 的自定义方法,如果你决定采用其他框架,你仍然可以重用该方法。 - J-Alex
@J-Alex,非常好的图表,只有一个小错误:@PostConstructpostProcessBeforeInitialization阶段的一部分,而不是单独的操作。详细信息请参见https://dev59.com/gGoy5IYBdhLWcg3wfOF4。 - igor.zh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接