未添加Bean的后置处理器处理的Bean的生命周期如下:
SpringIOC容器对Bean的生命周期的管理过程:
1、通过构造器或工厂方法创建Bean的实例
2、为Bean的属性赋值或对其他Bean的引用
3、调用Bean的初始化方法
4、使用Bean
5、当容器关闭时,调用Bean的销毁方法
在Bean的声明中设置init-method和destroy-method属性,为Bean指定初始化和销毁方法。
测试demo:
package com.demoinfo.common.model; import org.apache.commons.lang3.builder.ToStringBuilder; import java.io.Serializable; /** * 描述 测试类 * * @author *** * @date 2019/1/21 16:26 */ public class TestModule implements Serializable { private String name; private String phone; public TestModule() { System.out.println("***构造器***"); } public String getName() { return name; } public void setName(String name) { System.out.println("***注入属性值***"); this.name = name; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } void init() { System.out.println("***bean初始化方法加载***"); } void destroy() { System.out.println("***bean销毁方法加载***"); } @Override public String toString() { return new ToStringBuilder(this) .append("name", name) .append("phone", phone) .toString(); } } <!--测试bean--> <bean id="testModule" class="com.demoinfo.common.model.TestModule" init-method="init" destroy-method="destroy"> <property name="name" value="hello"/> <property name="phone" value="15328552325"/> </bean>
测试结果:
***构造器***
***注入属性值***
***注入属性值***
***bean初始化方法加载***
添加Bean的后置处理器处理的Bean的生命周期:
- Bean的后置处理器允许在调用初始化方法前后对Bean进行额外的处理。
- Bean的后置处器对IOC容器的所有Bean是逐一处理,而非单一实例
- Bean的后置处理器需要实现BeanPostProcessor接口。
使用后置处理器SpringIOC容器对Bean的生命周期进行管理:
1、使用构造器或工厂方法创建Bean实例
2、为Bean的属性设置值或对其他Bean的引用
3、将Bean的实例传递给Bean的后置处理器的postProcessBeforeInitialization方法
4、调用Bean的初始化方法
5、将Bean的实例传递给Bean的后置处理器的PostProcessAfterInitialization方法
6、使用Bean
7、当容器关闭时,调用Bean的销毁方法
测试demo如下:
package com.demoinfo; import com.demoinfo.common.model.TestModule; import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanPostProcessor; /** * 描述 * * @author *** * @date 2019/1/21 15:44 */ public class MyBeanPostProcessor implements BeanPostProcessor { @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { System.out.println("*******" + bean.toString() + "=========>" + beanName); if (bean instanceof TestModule) { TestModule tm = (TestModule) bean; //改变bean的一个属性值 tm.setName("helloWorld"); } return bean; } @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { System.out.println("*******" + bean.toString() + "=========>" + beanName); return bean; } } <!--配置后置处理器--> <bean class="com.demoinfo.MyBeanPostProcessor"/>
测试结果如下:
***构造器***
***注入属性值***
*******com.demoinfo.common.model.TestModule@7fd8c559[name=hello,phone=15328552325]=========>testModule
***注入属性值***
***bean初始化方法加载***
*******com.demoinfo.common.model.TestModule@7fd8c559[name=helloWorld,phone=15328552325]=========>testModule
***bean销毁方法加载***
2019-01-21 17:36:45,902 [main] INFO com.alibaba.druid.pool.DruidDataSource - {dataSource-1} closed