实现BeanPostProcessor
接口与在Spring中的XML配置文件中使用init
/ destroy
方法属性或实现InitializingBean
/ {{有什么区别? 1}} interface?
答案 0 :(得分:76)
关于Container Extension Points的Spring文档中已经清楚地解释了这一点。
BeanPostProcessor接口定义了您可以使用的回调方法 实现提供自己的(或覆盖容器的默认值) 实例化逻辑,依赖性解析逻辑等。如果你 想在Spring容器之后实现一些自定义逻辑 完成实例化,配置和初始化bean,你可以 插入一个或多个BeanPostProcessor实现。
因此,实质上BeanBostProcessor中定义的方法postProcessBeforeInitialization
在bean初始化之前被调用(如名称所示),同样在bean初始化之后调用postProcessAfterInitialization
。
与@PostConstruct
,InitializingBean
和自定义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完成之前执行。
我们可以使用实现接口InitializingBean
和DisposableBean
,或使用注释@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文档按以下顺序调用不同的回调方法:
主要区别在于,在postProcessBeforeInitialization()方法初始化完成后调用上述3个方法。
一旦这些方法完成,将调用postProcessAfterInitialization()方法,然后以相同的顺序调用destroy方法:
使用@PreDestroy注释的方法
由DisposableBean回调接口定义的destroy()
通过XML定义的destroy()方法。