bean的生命周期
在配置bean的时候指定 bean的初始化方法和析构函数。
下面的例子展示了从Ioc容器创建到创建bean实例到Ioc容器销毁的过程。
配置文件如下:
<bean id="flowerBean2" class="com.pfSoft.spel.Flower" init-method="testInitFun" destroy-method="testDestory"> <property name="flowerName" value="rose"></property> <property name="color" value="red"></property> <property name="price" value="20"></property> </bean>
将原实体类改写,在构造函数、属性赋值、中增加out输出,方便查看先后顺序,并新增init和destory方法:
public class Flower {
private String flowerName;
private Double price;
/**
*
* @return the flowerName
*/
public String getFlowerName() {
return flowerName;
}
/**
* @param flowerName the flowerName to set
*/
public void setFlowerName(String flowerName) {
System.out.println("这里执行属性的set方法,setFlowName");
this.flowerName = flowerName;
}
private String color;
/**
*
* @return the color
*/
public String getColor() {
return color;
}
/**
* @param color the color to set
*/
public void setColor(String color) {
System.out.println("这里执行属性的set方法,setcolor");
this.color = color;
}
/**
*
* @return the price
*/
public Double getPrice() {
return price;
}
/**
* @param price the price to set
*/
public void setPrice(Double price) {
this.price = price;
}
/* (non-Javadoc)
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
return "Flower [flowerName=" + flowerName + ", price=" + price
+ ", color=" + color + "]";
}
private Flower(){
System.out.println("这里执行构造函数");
}
private void testInitFun() {
System.out.println("这里执行初始化方法");
}
private void testDestory() {
System.out.println("这里执行destory方法");
}
}
测试代码如下:
ApplicationContext applicationContext;
@Before
public void init() {
applicationContext = new ClassPathXmlApplicationContext(
"spring-SpEL.xml");
}
@Test
public void testFlower() {
Flower flower = (Flower) applicationContext.getBean("flowerBean2");
System.out.println(flower);
}
@After
public void after() {
ClassPathXmlApplicationContext context = (ClassPathXmlApplicationContext) applicationContext;
context.close();
}
输出结果为:
这里执行构造函数 这里执行属性的set方法,setFlowName 这里执行属性的set方法,setcolor 这里执行初始化方法 Flower [flowerName=rose, price=20.0, color=red] 四月 26, 2016 10:19:33 下午 org.springframework.context.support.ClassPathXmlApplicationContext doClose 信息: Closing org.springframework.context.support.ClassPathXmlApplicationContext@1637f22: startup date [Tue Apr 26 22:19:33 CST 2016]; root of context hierarchy 这里执行destory方法
由此可见执行先后顺序为 bean的构造函数——》set方法——》配置bean时指定的init-method方法——》销毁时,bean中配置指定的destroy-method方法
创建bean后置处理器
需要实现BeanPostProcessor接口,并且这个处理器是针对所有bean的。
配置文件如下:
<bean id="flowerBean" class="com.pfSoft.spel.Flower" init-method="testInitFun" destroy-method="testDestory"> <property name="flowerName" value="rose"></property> <property name="color" value="red"></property> <property name="price" value="20"></property> </bean> <bean class="com.pfSoft.spel.MyBeanProcess"></bean>
Processor代码如下,在这里可以对实例化bean之前进行修改,返回的bean将是这里修改后的:
public Object postProcessBeforeInitialization(Object bean, String beanName)
throws BeansException {
return bean;
}
public Object postProcessAfterInitialization(Object bean, String beanName)
throws BeansException {
System.out.println("执行BeforeInitialization");
System.out.println(MessageFormat.format("修改前的bean为:{0}", bean));
if("flowerBean".equals(beanName))
{
System.out.println("开始修改值");
Flower flower= (Flower) bean;
flower.setColor("白色");
}
System.out.println(MessageFormat.format("修改后的bean为:{0}", bean));
return bean;
}
测试代码如下:
@Before
public void init() {
applicationContext = new ClassPathXmlApplicationContext("spring-SpEL.xml");
}
@Test
public void testFlower() {
com.pfSoft.spel.Flower flower = (Flower) applicationContext.getBean("flowerBean");
System.out.println(MessageFormat.format("测试输出flower:{0}", flower) );
}
@After
public void after() {
ClassPathXmlApplicationContext context = (ClassPathXmlApplicationContext) applicationContext;
context.close();
}
测试输出如下:
这里执行构造函数 这里执行属性的set方法,setFlowName 这里执行属性的set方法,setcolor 这里执行初始化方法 执行BeforeInitialization 修改前的bean为:Flower [flowerName=rose, price=20.0, color=red] 开始修改值 这里执行属性的set方法,setcolor 修改后的bean为:Flower [flowerName=rose, price=20.0, color=白色] 测试输出flower:Flower [flowerName=rose, price=20.0, color=白色] 四月 28, 2016 4:35:35 下午 org.springframework.context.support.ClassPathXmlApplicationContext doClose 信息: Closing org.springframework.context.support.ClassPathXmlApplicationContext@1637f22: startup date [Thu Apr 28 16:35:34 CST 2016]; root of context hierarchy 这里执行destory方法
由上可以看出bean的生命周期,执行过程。
浙公网安备 33010602011771号