最后 遗留一个问题,继续探索中....
跟我学Spring3 学习笔记一
跟我学Spring3 学习笔记二
跟我学Spring3 学习笔记三
跟我学Spring3 学习笔记四
跟我学Spring3 学习笔记五 注入
跟我学Spring3 学习笔记六 注入
统一接口:
public interface HelloApi {
public void sayHello();
}
一、延迟初始化:
/**
* 延迟初始化Bean
* 延迟初始化也叫做惰性初始化,指不提前初始化Bean,而是只有在真正使用时才创建及初始化Bean。
* 配置方式很简单只需在<bean>标签上指定 “lazy-init” 属性值为“true”即可延迟初始化Bean。
*/
public class DiLazyInit implements HelloApi{
public void sayHello() {
System.out.println("say DiInitDestory");
}
public DiLazyInit(){
System.out.println("初始化 DiInitDestory");
}
}
配置延迟初始化:
<!-- 延迟初始化Bean
延迟初始化也叫做惰性初始化,指不提前初始化Bean,而是只有在真正使用时才创建及初始化Bean。
配置方式很简单只需在<bean>标签上指定 “lazy-init” 属性值为“true”即可延迟初始化Bean。 -->
<bean id="lazyinitDi" class="com.diinit.DiLazyInit"
lazy-init="true">
</bean>
junit 进行测试:
@Test
public void testLazyInit(){
ApplicationContext context = new ClassPathXmlApplicationContext("initdepends.xml");
HelloApi lazyInit = context.getBean("lazyinitDi",HelloApi.class);
lazyInit.sayHello();
System.out.println("");
}
注意这个时候的输出结果:
初始化 DiLazyInit
say DiLazyInit
二、 可以指定初始化和销毁的顺序
/* 使用depends-on 是指 指定Bean初始化及销毁时的顺序,使用depends-on属性指定的Bean要先初始化完毕
* 后才初始化当前Bean,由于只有“singleton”Bean能被Spring管理销毁,所以当指定的Bean都是“singleton”
* 时,使用depends-on属性指定的Bean要在指定的Bean之后销毁。
* “decorator”指定了“depends-on”属性为“lazyinitDi”,所以在“decorator”Bean初始化之前要先初
* 始化“lazyinitDi”,而在销毁“lazyinitDi”之前先要销毁“decorator”,大家注意一下销毁顺序,与文档上的不符。
* “depends-on”属性可以指定多个Bean,若指定多个Bean可以用“;”、“,”、空格分割。
*
* 那“depends-on”有什么好处呢?
* 主要是给出明确的初始化及销毁顺序,比如要初始化“decorator”时要确保“lazyinitDi”Bean的资源准备好了,
* 否则使用“decorator”时会看不到准备的资源;而在销毁时要先在“decorator”Bean的把对“helloApi”资源的引用释
* 放掉才能销毁“lazyinitDi”,否则可能销毁 “lazyinitDi”时而“decorator”还保持着资源访问,造成资源不能释放或释放错误。
*/
public class ApiDecorator implements HelloApi{
private HelloApi helloApi;
public ApiDecorator(){
System.out.println("初始化 ApiDecorator");
}
public void sayHello() {
System.out.println("say ApiDecorator");
helloApi.sayHello();
}
public HelloApi getHelloApi() {
return helloApi;
}
public void setHelloApi(HelloApi helloApi) {
this.helloApi = helloApi;
}
}
配置xml指定初始化和销毁顺序:
<!-- 初始化及销毁时的顺序
“decorator”指定了“depends-on”属性为“lazyinitDi”,所以在“decorator”Bean初始化之前
要先初始化“lazyinitDi”,而在销毁“lazyinitDi”之前先要销毁“decorator”,大家注意一下销毁顺序 -->
<bean id="decorator" class="com.diinit.ApiDecorator"
depends-on="lazyinitDi">
<property name="helloApi">
<ref bean="lazyinitDi" />
</property>
</bean>
junit 进行测试:
@Test
public void testLazyInit(){
ApplicationContext context = new ClassPathXmlApplicationContext("initdepends.xml");
HelloApi lazyInit = context.getBean("lazyinitDi",HelloApi.class);
lazyInit.sayHello();
System.out.println("");
}
@Test
public void testDependsOn(){
ApplicationContext context= new ClassPathXmlApplicationContext("initdepends.xml");
HelloApi depends = context.getBean("decorator",HelloApi.class);
depends.sayHello();
}
注意这个时候的输出结果:
初始化 DiLazyInit
初始化 ApiDecorator //也是上面同样的测试函数 testLazyInit(),同样的配置 这句是多打印出来的
say DiLazyInit
初始化 DiLazyInit
初始化 ApiDecorator
say ApiDecorator
say DiLazyInit
这突然多出来的打印结果,说明进行了ApiDecorator的对象的创建,
但是在第一个配置中也没涉及到 ApiDecorator 类的加载,注入 。
什么原因造成的呢?是一种隐藏的注入? 继续探索中....
已有 1 人发表留言,猛击->>这里<<-参与讨论
ITeye推荐