Spring中的BeanPostProcessor和init / destroy方法有什么区别?
实现BeanPostProcessor接口与在Spring的XMLconfiguration文件中使用init / destroy方法属性还是实现InitializingBean / DisposableBean接口有什么区别?
在Spring文档中有关集装箱扩展点的解释很清楚。
BeanPostProcessor接口定义了您可以实现的callback方法,以提供您自己的(或覆盖容器的默认)实例化逻辑,依赖关系parsing逻辑等等。 如果您想在Spring容器完成实例化,configuration和初始化bean之后实现一些自定义逻辑,则可以插入一个或多个BeanPostProcessor实现。
所以实质上,在BeanPostProcessor中定义的postProcessBeforeInitialization
方法在bean初始化之前被调用(如名称所示),同样在bean的初始化之后调用postProcessAfterInitialization
。
与@ @PostConstruct
, InitializingBean
和自定义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销毁之前执行。
我们可以使用实现接口InitializingBean
和DisposableBean
,或者使用annotations @postconstruct
和@predestroy
,或者用init-method
和destroy-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
。 在此之后,组件被破坏。
最好使用属性中列出的方法。接口的实现BeanPostProcessor
和DisposableBean
使组件和Spring API之间的耦合成为可能。
a)postProcessBeforeInitialization()将在bean初始化之前调用。
b)一旦bean被初始化,按照Spring文档中的顺序调用不同的callback方法:
- 用@PostConstruct注解的方法
- 由InitializingBeancallback接口定义的afterPropertiesSet()
- 通过XML定义的init方法。
主要区别在于postProcessBeforeInitialization()方法在初始化完成后调用上述3个方法。
一旦这些方法完成,postProcessAfterInitialization()方法将被调用,然后以相同的顺序调用destroy方法:
-
用@PreDestroy注释的方法
-
destroy()由DisposableBeancallback接口定义
-
通过XML定义的destroy()方法。
- spring引导,logback和logging.config属性
- 获得Spring应用程序上下文
- Spring Boot JPA – configuration自动重新连接
- 使用@PropertySource批注时,@Value未parsing。 如何configurationPropertySourcesPlaceholderConfigurer?
- Spring 3.1 entityManagerFactory java.lang.NoSuchFieldError:NULL错误
- 在应用程序启动时使用Spring MVC执行Java类
- 在Spring-MVC控制器中触发404?
- 如何实例化一个在Spring框架中使用generics的对象?
- Spring RedirectAttributes:addAttribute vs addFlashAttribute