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

实现BeanPostProcessor接口与在Spring的XMLconfiguration文件中使用init / destroy方法属性还是实现InitializingBean / DisposableBean接口有什么区别?

在Spring文档中有关集装箱扩展点的解释很清楚。

BeanPostProcessor接口定义了您可以实现的callback方法,以提供您自己的(或覆盖容器的默认)实例化逻辑,依赖关系parsing逻辑等等。 如果您想在Spring容器完成实例化,configuration和初始化bean之后实现一些自定义逻辑,则可以插入一个或多个BeanPostProcessor实现。

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

与@ @PostConstructInitializingBean和自定义init方法的区别在于它们是在bean本身上定义的。 它们的顺序可以在Spring文档的组合生命周期机制部分find。

所以基本上,BeanPostProcessor可以用来为几个bean定制实例化逻辑,而其他bean是以bean为基础定义的。

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

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

BeanPostProcessor类有两个方法。

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

2)postProcessAfterInitialization – 在bean引用被赋予应用程序之前,你想要做的任何事情。

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

1)BeanPostProcessor.postProcessBeforeInitialization()

2)init()

3)BeanPostProcessor.postProcessAfterInitialization()

4)摧毁()

你可以通过编写具有sysout的简单例子来检查它,并检查它们的顺序。

BeanPostProcessor :BeanPostProcessor为您提供了一个机会,可以在实例化之后处理由IoC容器创build的bean的实例,然后在实例上发生初始化生命周期事件之后再次处理该实例。 您可以使用它来处理已设置的字段,对bean执行validation,甚至可以从远程资源查找值以在bean上设置为默认值。

BeanPostProcessors和它们所依赖的任何bean都在容器中的其他bean之前实例化。 在它们被实例化和sorting之后,它们被用来处理IoC容器实例化的所有其他bean。 Spring的caching,事务等不同的AOP代理都是由BeanPostProcessors应用的。 因此,您创build的任何BeanPostProcessor都不适用于AOP代理。 由于AOP代理是以这种方式应用的,因此可能还没有将AOP代理应用于实例,因此如果这将影响正在进行的后处理,应该小心。

init / destroy方法 :在Spring中,可以在bean的configuration文件中使用init-method和destroy-method作为属性,以在初始化和销毁​​时执行某些操作。

下面是一个示例,向您展示如何使用init-method和destroy-method。

 package com.xyz.customer.services; public class CustomerService { String message; public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } public void initIt() throws Exception { System.out.println("Init method after properties are set : " + message); } public void cleanUp() throws Exception { System.out.println("Spring Container is destroy! Customer clean up"); } } 

<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

 <bean id="customerService" class="com.xyz.customer.services.CustomerService" init-method="initIt" destroy-method="cleanUp"> <property name="message" value="i'm property message" /> </bean> 

还有一个主要的差异是InitializingBean,DisposableBean相关的afterPropertiesSet()和destory()方法不接受任何参数,返回types也是void,所以我们没有实现任何自定义逻辑。 但是来到BeanPostProcess方法postProcessBeforeInitialization(Object bean,String beanName)和postProcessAfterInitilization(Object bean,String beanName)都接受这两个参数,返回types也是Object,所以我们可以写入initilzation逻辑以及基于传递的任何自定义login豆…

这两个callback方法都包括bean生命周期,以下是生命周期

1)BeanPostProcessor.postProcessBeforeInitilazation()

2)@postConstruct或InitializingBean.afterPropertiesSet()或初始化方法
在xml / *中定义,如果有三种方法可用,这里也是遵循相同的方法** /

3)BeanPostProcessor.postProcessAfterInitialization()

4)@preDestroy或DisposibleBean.destroy()或销毁在xml / *中定义的方法如果有三种方式可用,

Init和Destroycallback方法是Spring bean生命周期阶段的一部分。 初始化方法将在bean初始化之前执行。 类似的Destroy方法将在Bean销毁之前执行。

我们可以使用实现接口InitializingBeanDisposableBean ,或者使用annotations @postconstruct@predestroy ,或者用init-methoddestroy-method属性声明<bean>来实现这个function。

BeanPostProcessor接口用于扩展框架的function,如果想在Spring容器创buildbean的前后做任何configuration。

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

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

Spring组件在Spring IoC容器中经历了从创build到销毁的几个阶段。 在创build该组件之前,可能需要对该组件进行一些初始化操作。 同样,在从IoC容器销毁和移除组件之前,可能需要一些操作。 为此,Spring框架允许为组件生命周期pipe理定义方法。

  • BeanPostProcessor接口和init-method指定init-method与组件创build阶段相关。

如果组件实现了接口BeanPostProcessor ,那么Spring IoC容器将调用此接口的方法: postProcessBeforeInitialization()postProcessAfterInitialization() 。 在此之后,组件即可使用,并在销毁之前保留在IoC容器中。 在这两个方法之间调用init-method属性中指定的方法。 (实际上,在接口InitializingBean的方法afterPropertiesSet()之前,如果组件实现了这个接口)。

  • DisposableBean接口和destroy-method指定destroy-method与组件销毁阶段相关。

如果组件实现了DisposableBean接口,那么Spring IoC容器调用这个接口的方法: destroy() 。 之后将被称为属性destroy-method指定destroy-method 。 在此之后,组件被破坏。

最好使用属性中列出的方法。接口的实现BeanPostProcessorDisposableBean使组件和Spring API之间的耦合成为可能。

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

b)一旦bean被初始化,按照Spring文档中的顺序调用不同的callback方法:

  1. 用@PostConstruct注解的方法
  2. 由InitializingBeancallback接口定义的afterPropertiesSet()
  3. 通过XML定义的init方法。

主要区别在于postProcessBeforeInitialization()方法在初始化完成后调用上述3个方法。

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

  1. 用@PreDestroy注释的方法

  2. destroy()由DisposableBeancallback接口定义

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