Bean的生命周期
一、了解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());
}
}
推荐文章 |
