Spring中的BeanPostProcessor和init / destroy方法有什么区别?

时间:2012-03-25 17:02:22

标签: spring

实现BeanPostProcessor接口与在Spring中的XML配置文件中使用init / destroy方法属性或实现InitializingBean / {{有什么区别? 1}} interface?

6 个答案:

答案 0 :(得分:76)

关于Container Extension Points的Spring文档中已经清楚地解释了这一点。

  

BeanPostProcessor接口定义了您可以使用的回调方法   实现提供自己的(或覆盖容器的默认值)   实例化逻辑,依赖性解析逻辑等。如果你   想在Spring容器之后实现一些自定义逻辑   完成实例化,配置和初始化bean,你可以   插入一个或多个BeanPostProcessor实现。

因此,实质上BeanBostProcessor中定义的方法postProcessBeforeInitialization在bean初始化之前被调用(如名称所示),同样在bean初始化之后调用postProcessAfterInitialization

@PostConstructInitializingBean和自定义init方法的区别在于它们是在bean本身上定义的。它们的排序可以在spring文档的Combining lifecycle mechanisms部分找到。

因此,基本上BeanPostProcessor可用于为多个bean执行自定义实例化逻辑,而其他bean则基于每个bean进行定义。

答案 1 :(得分:16)

以上答案清楚地解释了一些非常重要的方面。

除此之外,理解beanPostProcessor和init和destroy方法都是Spring bean生命周期的一部分也很重要。

BeanPostProcessor类有两种方法。

1)postProcessBeforeInitialization - 正如名称清楚地表明,它用于确保在初始化之前采取所需的操作。例如您想从远程源/服务加载某些属性文件/读取数据。

2)postProcessAfterInitialization - 在bean引用之前初始化之后要做的任何事情都被提供给应用程序。

生命周期中质疑方法的顺序如下:

1)BeanPostProcessor.postProcessBeforeInitialization()

2)init()

3)BeanPostProcessor.postProcessAfterInitialization()

4)destroy()

您可以通过编写具有sysout的简单示例来检查这一点,并检查它们的顺序。

答案 2 :(得分:5)

另一个主要差异是InitializingBean,DisposableBean与afterPropertiesSet()& destory()方法不接受任何参数,返回类型也是void,所以我们没有实现任何自定义逻辑。 但是来到BeanPostProcess方法postProcessBeforeInitialization(Object bean,String beanName)和postProcessAfterInitilization(Object bean,String beanName)接受那两个参数并返回类型也是Object所以我们能够编写initilzation逻辑以及基于传递的任何自定义登录豆...

这两个回调方法feautes包括bean生命周期,以下是生命周期如下

1)BeanPostProcessor.postProcessBeforeInitilazation()

2)@ postConstruct或InitializingBean.afterPropertiesSet()或初始化方法    在xml / * 中定义,如果可以使用三种方式,它也遵循相同的oredr ** /

3)BeanPostProcessor.postProcessAfterInitialization()

4)@preDestroy或DisposibleBean.destroy()或在xml中定义的destroy方法      / * 如果可以使用三种方式,它也会跟随相同的oredr ** /

答案 3 :(得分:5)

Init和Destroy回调方法是Spring bean生命周期阶段的一部分。在bean实例化之后将执行 init 方法。同样, destroy 方法将在bean完成之前执行。

我们可以使用实现接口InitializingBeanDisposableBean,或使用注释@postconstruct@predestroy来实现此功能,或者使用{{1}声明<bean> }和init-method属性。

BeanPostProcessor接口用于扩展框架的功能,如果想要进行任何配置由spring容器完成的pre-and-bean初始化。

例如:默认情况下,Spring不会知道destroy-method@PostConstruct注释。要启用它,我们必须注册@PreDestroy或在bean配置文件中指定CommonAnnotationBeanPostProcessor。这里<context:annotation-config />是注释的预定义CommonAnnotationBeanPostProcessor实现。喜欢:

@Required 启用BeanPostProcessor处理工具
@Autowired 启用RequiredAnnotationBeanPostProcessor处理工具

答案 4 :(得分:1)

只是上述所有答案的简短补充:如果您有任何通用逻辑,则需要将通用逻辑普遍应用于所有Spring Bean,例如将记录器注入到您的Bean中,设置属性文件,通过反射将默认值设置为bean的字段;您可以将该逻辑放在一个位置:@Override n回调(例如:postProcessBeforeInitialization(Object arg0, String arg1),如果要实现BeanPostProcessor接口);而不是在所有bean上重复相同的逻辑。

答案 5 :(得分:-1)

a)在初始化bean之前将调用postProcessBeforeInitialization()。

b)初始化bean之后,按照Spring文档按以下顺序调用不同的回调方法:

  1. 使用@PostConstruct注释的方法
  2. 由InitializingBean回调接口
  3. 定义的afterPropertiesSet()
  4. 通过XML定义的init方法。
  5. 主要区别在于,在postProcessBeforeInitialization()方法初始化完成后调用上述3个方法。

    一旦这些方法完成,将调用postProcessAfterInitialization()方法,然后以相同的顺序调用destroy方法:

    1. 使用@PreDestroy注释的方法

    2. 由DisposableBean回调接口定义的destroy()

    3. 通过XML定义的destroy()方法。