在学习Servlet的时候,也提过生命周期。人从出生,到死亡经历一个过程,bean也一样,每个bean经历5个阶段:
1.通过构造器或工厂方法创建 Bean 实例
2.为 Bean 的属性设置值和对其他 Bean 的引用
3.调用 Bean 的初始化方法
4.Bean 可以使用了
5.当容器关闭时, 调用 Bean 的销毁方法
下面通过一个例子来说明:
(1)src/com/csu/cycle/Country.class
package com.csu.cycle;
public class Country {
private String name;
private int size;
public Country() {
// TODO Auto-generated constructor stub
//观察什么时候调用构造器
System.out.println("constructor....");
}
public Country(String name, int size) {
super();
this.name = name;
this.size = size;
}
public void init() {
//观察什么时候初始化
System.out.println("init.....");
}
public void destory() {
//观察什么时候销毁
System.out.println("destory....");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getSize() {
return size;
}
public void setSize(int size) {
this.size = size;
}
@Override
public String toString() {
return "Country [name=" + name + ", size=" + size + "]";
}
}
(2)src/beans-cycle.xml:
<!--init-method 和 destory-method指定方法名,该方法名可以自己取-->
<bean id="country" class="com.csu.cycle.Country"
p:name="China" p:size="960" init-method="init"
destroy-method="destory"
></bean>
(3)src/com/csu/cycle/Main.class
public static void main(String[] args) {
ClassPathXmlApplicationContext context=new ClassPathXmlApplicationContext("beans-cycle.xml");
Country country=(Country) context.getBean("country");
System.out.println(country);
context.close();
}
接下来看看运行结果:
从运行结果可以看出来,首先用构造器获得了一个bean赋好属性值,然后调用了Country的init方法,接下来打印出country,最后调用destroy方法销毁。
除此之外,在调用Init方法前后,还可以进行一些细化的工作,用到spring的一个接口:BeanPostProcessor, 该接口定义了两个方法:
public Object postProcessAfterInitialization(Object bean, String beanName),
public Object postProcessBeforeInitialization(Object bean, String arg1);
(1)src/com.csu.cycle/ProPostProcessor.class:
public class PropostProcessor implements BeanPostProcessor {
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
// TODO Auto-generated method stub
System.out.println("after init"+bean+beanName);
return bean;
}
@Override
public Object postProcessBeforeInitialization(Object bean, String arg1) throws BeansException {
// TODO Auto-generated method stub
System.out.println("before init"+bean+arg1);
return bean;
}
}
(2) beans-cycle.xml:
IOC会自动识别实现了BeanPostProcessor接口的类,所以这里没有必要再定义id了,并且PropostProcessor 对所有bean都起作用(如果需要对只对某个特定的bean起作用,则在方法中做判断)。
<bean class="com.csu.cycle.PropostProcessor"></bean>
运行结果是:
最后,在这两个方法:
public Object postProcessAfterInitialization(Object bean, String beanName),
public Object postProcessBeforeInitialization(Object bean, String arg1);
中,可以把bean给偷梁换柱了再返回去,例如:
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
// TODO Auto-generated method stub
//可偷梁换柱
bean = new Country("USA",77);
System.out.println("after init"+bean+beanName);
return bean;
}
这样运行结果是: