一、了解bean的生命周期
只有singleton行为的bean接受容器管理生命周期。
non - singleton行为的bean,Spring容器仅仅是new的替代,容器只负责创建。
二、定制bean的生命周期行为
1 .依赖关系注入之后的行为
public class Chinese implements Person ... {
private Axe axe;
public Chinese() ...{
System.out.println("Spring实例化主调bean:Chinese实例...");
}
public void setAxe(Axe axe) ...{
System.out.println("Spring执行依赖关系注入...");
}
public void init() ...{
System.out.println("正在执行初始化方法...");
}
}
<? xml versin = " 1.0 " encoding = " gb2312 " ?>
<! DOCTYPE beans PUBLIC " -//SPRING//DTD BEAN//EN "
" http://www.springframework.org/dtd/spring-beans.dtd " >
< beans >
< bean id = " steelAxe " class = " prolove.SteelAxe " />
< bean id = " chinese " class = " prolove.Chinese " init - method = " init " >
< property name = " axe " >
< ref local = " steelAxe " />
</ property >
</ bean >
</ beans >
public class Chinese implements Person, InitializingBean ... {
private Axe axe;
public Chinese() ...{
System.out.println("Spring实例化主调bean:Chinese实例...");
}
public void setAxe(Axe axe) ...{
System.out.println("Spring执行依赖关系注入...");
}
public void afterPropertiesSet() throws Exception ...{
System.out.println("正在执行初始化方法...");
}
}
2 .bean销毁之前的行为
public class Chinese implements Person ... {
private Axe axe;
public Chinese() ...{
System.out.println("Spring实例化主调bean:Chinese实例...");
}
public void setAxe(Axe axe) ...{
System.out.println("Spring执行依赖关系注入...");
}
public void close() ...{
System.out.println("正在执行销毁前的资源回收方法...");
}
}
<? xml versin = " 1.0 " encoding = " gb2312 " ?>
<! DOCTYPE beans PUBLIC " -//SPRING//DTD BEAN//EN "
" http://www.springframework.org/dtd/spring-beans.dtd " >
< beans >
< bean id = " steelAxe " class = " prolove.SteelAxe " />
< bean id = " chinese " class = " prolove.Chinese " destroy - method = " init " >
< property name = " axe " >
< ref local = " steelAxe " />
</ property >
</ bean >
</ beans >
public class Chinese implements Person, DisposableBean ... {
private Axe axe;
public Chinese() ...{
System.out.println("Spring实例化主调bean:Chinese实例...");
}
public void setAxe(Axe axe) ...{
System.out.println("Spring执行依赖关系注入...");
}
public void destroy() throws Exception ...{
System.out.println("正在执行销毁前的资源回收方法...");
}
}
三、协调不同步的bean
public class SteelAxe implements Axe ... {
private int count = 0;
public SteelAxe() ...{
System.out.println("Spring实例化依赖bean:SteelAxe实例");
}
public String chop() ...{
return "钢斧砍柴真快" + ++count;
}
}
public abstract class Chinese implements Person ... {
private Axe axe;
public Chinese() ...{
System.out.println("Spring实例化主调bean:Chinese实例...");
}
//方法注入所需要的方法,该方法由Spring提供实现
public abstract Axe createAxe();
public void setAxe(Axe axe) ...{
System.out.println("Spring执行依赖关系注入...");
this.axe = axe;
}
public Axe getAxe() ...{
return axe;
}
}
<? xml versin = " 1.0 " encoding = " gb2312 " ?>
<! DOCTYPE beans PUBLIC " -//SPRING//DTD BEAN//EN "
" http://www.springframework.org/dtd/spring-beans.dtd " >
< beans >
< bean id = " steelAxe " class = " prolove.SteelAxe " singleton = " false " />
< bean id = " chinese " class = " prolove.Chinese " >
< lookup - method name = " createAxe " bean = " steelAxe " />
< property name = " axe " >
< ref local = " steelAxe " />
</ property >
</ bean >
</ beans >
public class BeanTest ... {
public static void main(String[] args) throws Exception ...{
InputStream is = new FileInputStream("bean.xml");
InputStreamResource isr = new InputStreamResource(is);
XmlBeanFactory factory = new XmlBeanFactory(isr);
Person p = (Person)factory.getBean("chinese");
Axe axe1 = p.getAxe();
Axe axe2 = p.getAxe();
System.out.println("没有采用Lookup方法注入:");
System.out.println("Random的两个实例指向同一个引用:" + (axe1 == axe2));
System.out.println(axe1.chop());
System.out.println(axe2.chop());
//调用Lookup注入,则保证每次产生新的nog-singleton bean实例
Axe axe3 = p.createAxe();
Axe axe4 = p.createAxe();
System.out.println("采用Lookup方法注入之后:");
System.out.println("Random的两个实例指向同一个引用:" + (axe1 == axe2));
System.out.println(axe3.chop());
System.out.println(axe4.chop());
}
}
只有singleton行为的bean接受容器管理生命周期。
non - singleton行为的bean,Spring容器仅仅是new的替代,容器只负责创建。
二、定制bean的生命周期行为
1 .依赖关系注入之后的行为
public class Chinese implements Person ... {
private Axe axe;
public Chinese() ...{
System.out.println("Spring实例化主调bean:Chinese实例...");
}
public void setAxe(Axe axe) ...{
System.out.println("Spring执行依赖关系注入...");
}
public void init() ...{
System.out.println("正在执行初始化方法...");
}
}
<? xml versin = " 1.0 " encoding = " gb2312 " ?>
<! DOCTYPE beans PUBLIC " -//SPRING//DTD BEAN//EN "
" http://www.springframework.org/dtd/spring-beans.dtd " >
< beans >
< bean id = " steelAxe " class = " prolove.SteelAxe " />
< bean id = " chinese " class = " prolove.Chinese " init - method = " init " >
< property name = " axe " >
< ref local = " steelAxe " />
</ property >
</ bean >
</ beans >
public class Chinese implements Person, InitializingBean ... {
private Axe axe;
public Chinese() ...{
System.out.println("Spring实例化主调bean:Chinese实例...");
}
public void setAxe(Axe axe) ...{
System.out.println("Spring执行依赖关系注入...");
}
public void afterPropertiesSet() throws Exception ...{
System.out.println("正在执行初始化方法...");
}
}
2 .bean销毁之前的行为
public class Chinese implements Person ... {
private Axe axe;
public Chinese() ...{
System.out.println("Spring实例化主调bean:Chinese实例...");
}
public void setAxe(Axe axe) ...{
System.out.println("Spring执行依赖关系注入...");
}
public void close() ...{
System.out.println("正在执行销毁前的资源回收方法...");
}
}
<? xml versin = " 1.0 " encoding = " gb2312 " ?>
<! DOCTYPE beans PUBLIC " -//SPRING//DTD BEAN//EN "
" http://www.springframework.org/dtd/spring-beans.dtd " >
< beans >
< bean id = " steelAxe " class = " prolove.SteelAxe " />
< bean id = " chinese " class = " prolove.Chinese " destroy - method = " init " >
< property name = " axe " >
< ref local = " steelAxe " />
</ property >
</ bean >
</ beans >
public class Chinese implements Person, DisposableBean ... {
private Axe axe;
public Chinese() ...{
System.out.println("Spring实例化主调bean:Chinese实例...");
}
public void setAxe(Axe axe) ...{
System.out.println("Spring执行依赖关系注入...");
}
public void destroy() throws Exception ...{
System.out.println("正在执行销毁前的资源回收方法...");
}
}
三、协调不同步的bean
public class SteelAxe implements Axe ... {
private int count = 0;
public SteelAxe() ...{
System.out.println("Spring实例化依赖bean:SteelAxe实例");
}
public String chop() ...{
return "钢斧砍柴真快" + ++count;
}
}
public abstract class Chinese implements Person ... {
private Axe axe;
public Chinese() ...{
System.out.println("Spring实例化主调bean:Chinese实例...");
}
//方法注入所需要的方法,该方法由Spring提供实现
public abstract Axe createAxe();
public void setAxe(Axe axe) ...{
System.out.println("Spring执行依赖关系注入...");
this.axe = axe;
}
public Axe getAxe() ...{
return axe;
}
}
<? xml versin = " 1.0 " encoding = " gb2312 " ?>
<! DOCTYPE beans PUBLIC " -//SPRING//DTD BEAN//EN "
" http://www.springframework.org/dtd/spring-beans.dtd " >
< beans >
< bean id = " steelAxe " class = " prolove.SteelAxe " singleton = " false " />
< bean id = " chinese " class = " prolove.Chinese " >
< lookup - method name = " createAxe " bean = " steelAxe " />
< property name = " axe " >
< ref local = " steelAxe " />
</ property >
</ bean >
</ beans >
public class BeanTest ... {
public static void main(String[] args) throws Exception ...{
InputStream is = new FileInputStream("bean.xml");
InputStreamResource isr = new InputStreamResource(is);
XmlBeanFactory factory = new XmlBeanFactory(isr);
Person p = (Person)factory.getBean("chinese");
Axe axe1 = p.getAxe();
Axe axe2 = p.getAxe();
System.out.println("没有采用Lookup方法注入:");
System.out.println("Random的两个实例指向同一个引用:" + (axe1 == axe2));
System.out.println(axe1.chop());
System.out.println(axe2.chop());
//调用Lookup注入,则保证每次产生新的nog-singleton bean实例
Axe axe3 = p.createAxe();
Axe axe4 = p.createAxe();
System.out.println("采用Lookup方法注入之后:");
System.out.println("Random的两个实例指向同一个引用:" + (axe1 == axe2));
System.out.println(axe3.chop());
System.out.println(axe4.chop());
}
}