在Bean的声明周期中,有两个事件尤为重要:post-initialization和pre-destruction。
Spring提供了两种机制:interface-based和method-based,供bean签入上述事件。
所谓的post-initialization和pre-destruction,是指在bean的属性设置完毕执行的事件和在bean销毁之前执行的事件。
method-based机制:通过在BeanFactory中的配置,init-method和destory-method,通过设置这两个属性来指定要执行的回调方法。
interface-based机制:bean需要实现InitializatingBean接口和DisposableBean接口。这两个接口分别拥有afterPropertiesSet()方法和destroy()方法。这两个方法在bean初始化后和销毁前被执行。效果与method-based机制等同。
以下是网上流传一个例子,我在eclipse中运行了一下
package com.test; import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; import org.springframework.beans.BeansException; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.BeanFactoryAware; import org.springframework.beans.factory.BeanNameAware; import org.springframework.beans.factory.DisposableBean; import org.springframework.beans.factory.InitializingBean; public class LifeCycle implements BeanNameAware, BeanFactoryAware, InitializingBean, DisposableBean { public LifeCycle() { System.out.println("Constructor executing"); } private String cycle; public void setCycle(String cycle) { System.out.println("Setter methods executing"); this.cycle = cycle; } @Override public void setBeanName(String beanName) { System.out.println("BeanNameAware.setBeanName(String beanName) executing"); } @Override public void setBeanFactory(BeanFactory beanFactory) throws BeansException { System.out.println("BeanFactoryAware.setBeanFactory(BeanFactory beanFactory) executing"); } @PostConstruct public void beforeBeanConstructed() { System.out.println("BeanPostProcessor executing (before bean constructed)"); } @Override public void afterPropertiesSet() throws Exception { System.out.println("InitializingBean.afterPropertiesSet() executing"); } public void initMethod() { System.out.println("InitMethod executing"); } @PreDestroy public void afterBeanConstructed() { System.out.println("BeanPostProcessor executing (after bean constructed)"); } @Override public void destroy() throws Exception { System.out.println("DisposableBean.destroy() executing"); } public void destroyMethod() { System.out.println("DestroyMethod executing"); } }
<?xml version="1.0" encoding="UTF-8"?> <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-3.0.xsd"> <bean id="lifeCycle" class="com.test.LifeCycle" init-method="initMethod" destroy-method="destroyMethod"> <property name="cycle" value="Life Cycle"/> </bean> <bean id="beanPostProcessor" class="org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor"> <property name="initAnnotationType" value="javax.annotation.PostConstruct"/> <property name="destroyAnnotationType" value="javax.annotation.PreDestroy"/> </bean> </beans>
package com.test; import org.springframework.beans.factory.config.BeanPostProcessor; import org.springframework.beans.factory.xml.XmlBeanFactory; import org.springframework.core.io.ClassPathResource; public class LifeCycleDemo { public static void main(String[] args) { XmlBeanFactory factory = new XmlBeanFactory(new ClassPathResource("beans-config.xml")); BeanPostProcessor bpp = (BeanPostProcessor)factory.getBean("beanPostProcessor"); factory.addBeanPostProcessor(bpp); LifeCycle lifeCycle = (LifeCycle)factory.getBean("lifeCycle"); factory.destroySingleton("lifeCycle"); } }
最后运行结果是: Constructor executing Setter methods executing BeanNameAware.setBeanName(String beanName) executing BeanFactoryAware.setBeanFactory(BeanFactory beanFactory) executing BeanPostProcessor executing (before bean constructed) InitializingBean.afterPropertiesSet() executing InitMethod executing BeanPostProcessor executing (after bean constructed) DisposableBean.destroy() executing DestroyMethod executing
注入Bean具体的实现:
具体的bean创建过程和依赖关系的注入在createBean中,这个方法在AbstractAutowireCapableBeanFactory中给出了实现:
protected Object createBean(String beanName, RootBeanDefinition mergedBeanDefinition, Object[] args) throws BeanCreationException { // Guarantee initialization of beans that the current one depends on. // 这里对取得当前bean的所有依赖bean,确定能够取得这些已经被确定的bean,如果没有被创建,那么这个createBean会被这些IOC // getbean时创建这些bean if (mergedBeanDefinition.getDependsOn() != null) { for (int i = 0; i < mergedBeanDefinition.getDependsOn().length; i++) { getBean(mergedBeanDefinition.getDependsOn()[i]); } } ........ // 这里是实例化bean对象的地方,注意这个BeanWrapper类,是对bean操作的主要封装类 if (instanceWrapper == null) { instanceWrapper = createBeanInstance(beanName, mergedBeanDefinition,args); } Object bean = instanceWrapper.getWrappedInstance(); ...... //这个populate方法,是对已经创建的bean实例进行依赖注入的地方,会使用到在loadBeanDefinition的时候得到的那些propertyValue来对bean进行注入。 if (continueWithPropertyPopulation) { populateBean(beanName, mergedBeanDefinition, instanceWrapper); } //这里完成客户自定义的对bean的一些初始化动作 Object originalBean = bean; bean = initializeBean(beanName, bean, mergedBeanDefinition); // Register bean as disposable, and also as dependent on specified "dependsOn"beans. registerDisposableBeanIfNecessary(beanName, originalBean,mergedBeanDefinition); return bean; } ......... }
相关推荐
Error creating bean with name 'org.springframework.web.servlet.handler.SimpleUrlHandlerMapping#0' defined in ServletContext resource [/WEB-INF/springMVC-servlet.xml]: Initialization of bean failed;...
"Array-Initialization-.zip" 文件可能是一个教学资源,专为帮助用户掌握在LabVIEW中如何初始化和操作数组而设计。在这个实验室练习中,"Array Initialization .vi" 可能是一个虚拟仪器(VI)示例,演示了数组的创建...
在计算机硬件领域,PCI(Peripheral Component Interconnect)系统地址映射初始化是一个至关重要的步骤,它涉及到BIOS(基本输入输出系统)在启动过程中如何管理和分配系统内存资源给PCI设备。本文将深入探讨PCI设备...
这使得它可以在Bean的生命周期中多个点进行干预,例如,在属性赋值之后修改属性值,这在Spring的自动注入和AOP实现中非常有用。 - BeanPostProcessor:这个接口允许在Bean初始化之前和之后进行扩展。它用于修改Bean...
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'customAreaService' defined in class path resource [applicationContext.xml]: Initialization of bean failed;...
在实际开发中,为了更好地理解和利用System.ComponentModel.Composition.Initialization.dll,我们需要熟悉MEF的基本概念,如导入(Import)、导出(Export)、部分类(Part)以及属性导入(ImportingProperty)等。...
Improving Deep Neural Networks: Hyperparameter tuning, Regularization and Optimization-2.1.1-initialization初始化
c8051F340 端口初始化 Target: C8051F340, F341, F342, F343, F344, F345, F346, F347 // Tool chain: Keil // Command Line: None
STM32CubeMX是意法半导体公司(STMicroelectronics)推出的一款图形化工具,它用于STM32微控制器的配置和初始化,通过它能够生成初始化C代码。该工具属于STMCube™系列,它能够简化微控制器的配置过程,覆盖STM32的...
传统的水平集方法通常需要保持水平集函数近似于符号距离函数,这通常通过周期性地重新初始化来实现,以保持稳定性和准确性。然而,重新初始化可能导致零水平集的位移,且何时、如何进行重新初始化是一个挑战。新方法...
雷达目标跟踪中的直观法航迹起始程序,其中包含两个文件:simutrack.m和main.m。simutrack.m是目标轨迹仿真;main.m是主文件。
Apply the Resource Acquisition Is Initialization mechanism to a wide variety of problem domains Manage the sometimes arcane relationship between arrays and pointers Use template programming to ...
Servlet Context Initialization Scanning for Servlets, Filters, and listeners 27.4.3. The ServletWebServerApplicationContext 27.4.4. Customizing Embedded Servlet Containers Programmatic Customization ...
play-services-ads-lite-18.3.0是2019-11-23为止,最新的安卓admob sdk,用于原生安卓介入 加入工程后: ...import com.google.android.gms.ads.initialization.OnInitializationCompleteListener; 即可
该项目包含一个测试,该测试查询内存中的h2数据库以确保其不为空 $ mvn test ... 2014-10-14 10:10:21.409 WARN 3435 --- [ main] o.s.b.a.jdbc.DataSourceInitializer : Could not send event to complete ...
使用MEX 实用工具,将C,C ,Ada,和Fortran 语言的S-Function 编译成MEX-文件,在需要的时候,它们可与其它的MEX-文件一起动态地连接到MATLAB 中。 S-Function 使用一种特殊的调用格式让你可以与Simulink 方程求解...
bf533的initialization中需要选择的.dxe工程Init_Sdram,配置在Poject Option - initialization ,烧录LDR需要选择,要和自己所应用的实际SDRAM配置一致才能启动成功
- **Pre-increment and Pre-decrement:** Prefer pre-increment and pre-decrement over post-increment and post-decrement when the value is not needed after the operation. - **Use of const:** Use const for...