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

Luc*_*uke 55 spring

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

Emi*_*l H 81

关于Container扩展点的Spring文档中已经清楚地解释了这一点.

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

因此,在本质的方法postProcessBeforeInitialization在了BeanPostProcessor定义得到bean初始化之前调用(如名称所示),并同样将postProcessAfterInitialization获得bean的初始化后调用.

到的差@PostConstruct,InitializingBean和自定义init方法是,这些是在bean本身定义的.它们的排序可以在spring文档的Combining lifecycle mechanisms部分找到.

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


neo*_*neo 17

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

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

BeanPostProcessor类有两种方法.

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

2)postProcessAfterInitialization - 在bean引用之前初始化之后要做的任何事情都被赋予应用程序.

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

1)BeanPostProcessor.postProcessBeforeInitialization()

2)init()

3)BeanPostProcessor.postProcessAfterInitialization()

4)destroy()

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


小智 6

而另一个主要的差异是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**/


Pre*_*raj 6

Init和Destroy回调方法是Spring bean生命周期阶段的一部分.该初始化方法去豆实例化后执行.类似地,destroy方法将在bean完成之前执行.

我们可以通过实现接口的实现这个功能InitializingBeanDisposableBean,或使用注释@postconstruct@predestroy或声明<bean>init-methoddestroy-method属性.

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

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

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