Spring Bean创建的生命周期:为什么有多个交互点?

3

我正在学习Spring,但是在bean的生命周期方面遇到了困难!

在创建bean时,Spring提供了几种与之交互的方式。我们可以使用以下任意一种或全部:

BeanFactoryPostProcessor
BeanPostProcessor#postProcessBeforeInitialization
@PostConstruct
InitializingBean#afterPropertiesSet
@Bean#initMethod
BeanPostProcessor#postProcessAfterInitialization

Spring按照以上顺序调用它们

我的问题是:为什么有这么多交互点?每个交互点应该在什么情况下使用?


相关问题 https://dev59.com/obPma4cB1Zd3GeqPkxRV - Ori Marko
@user7294900 是相关的,但它没有回答我的问题 :) - flywell
1个回答

3
一个BeanFactoryPostProcessor和一个BeanPostProcessor是两个不同的事物,也适用于不同的东西。 BeanFactoryPostProcessor将操作bean的元数据(我喜欢称之为配方),并进行后处理。一个众所周知的例子是PropertySourcesPlaceholderConfigurer,它将在配置中注入/替换所有带有@Value的值。BeanFactoryPostProcessor作用于元数据,因此在任何bean被创建之前。 BeanPostProcessor可以应用于bean甚至可以替换bean。Spring AOP经常使用这个。一个例子是PersistenceExceptionTranslationPostProcessor,当一个bean被创建时,它将通过这个BeanPostProcessor,如果它被注释为@Persistence,则该bean将被代理替换。这个代理添加了异常转换(即它将JpaExceptionSQLException转换为Spring DataAccessException)。这是在BeanPostProcessor中完成的。可以在调用init-callbacks之前或之后完成(postProcessBeforeInitialization或之后,postProcessAfterInitialization)。PersistenceExceptionTranslationPostProcessor将在postProcessAfterInitialization中运行,因为它需要确保bean已经初始化。 ServletContextAwareProcessor将在对象创建后立即运行,以尽早地注入ServletContext,因为bean的初始化可能取决于它。
初始化bean的3个回调方法大致相同,但是它们按顺序调用,因为它们已包含在较新版本中。它从只有一个InitializingBean接口和xml中的init-method开始(稍后也添加到@Bean中,并且当注释成为一种事物时添加了注释支持)。
您需要init方法来初始化bean,例如,您可能要检查是否已设置所有属性(例如,所需数据源),或者您可能要启动某些内容。 DataSource(特别是连接池)是初始化的好例子。在注入所有依赖关系后,您希望启动池,以便它打开连接。现在,由于您可能无法修改代码,因此如果您控制代码,则要使用init-method,如果您编写依赖于Spring的框架,则应使用InitializingBean

除了这三个初始化方法外,您还可以使用销毁方法。其中DisposableBean接口(和destroy-method)以及@PreDestroy注释。同样,当您停止应用程序时,您还想关闭连接池中的连接,并且可能希望在DataSource上调用close方法。这是一个完美的销毁回调示例。


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