最后 遗留一个问题,继续探索中....
统一接口:
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 类的加载,注入 。
什么原因造成的呢?是一种隐藏的注入? 继续探索中....
问题已经找到,是自己的问题
depends-on="lazyinitDi" 这个去掉
输出的结果就变了
初始化 ApiDecorator 使用lazy-init属性Spring对Bean进行了预初始化
初始化 DiLazyInit
say DiLazyInit
初始化 DiLazyInit
初始化 ApiDecorator
say ApiDecorator
say DiLazyInit
depends-on="lazyinitDi" 这个去掉
输出的结果就变了
初始化 ApiDecorator 使用lazy-init属性Spring对Bean进行了预初始化
初始化 DiLazyInit
say DiLazyInit
初始化 DiLazyInit
初始化 ApiDecorator
say ApiDecorator
say DiLazyInit
相关推荐
【第七章】 对JDBC的支持 之 7.3 关系数据库操作对象化 ——跟我学spring3 【第七章】 对JDBC的支持 之 7.4 Spring提供的其它帮助 ——跟我学spring3 【第七章】 对JDBC的支持 之 7.5 集成Spring JDBC及最佳...
【第八章】 对ORM的支持 之 8.1 概述 ——跟我学spring3 【第八章】 对ORM的支持 之 8.2 集成Hibernate3 ——跟我学spring3 【第八章】 对ORM的支持 之 8.3 集成iBATIS ——跟我学spring3 【第八章】 对ORM的支持 之...
跟我学Spring,Spring3学习资料,讲的还是很详细的,适合新手看
跟我学spring3 跟我学spring3 跟我学spring3
Springcloud学习笔记.md,Springcloud学习笔记.md,Springcloud学习笔记.md,Springcloud学习笔记.md,Springcloud学习笔记.md,Springcloud学习笔记.md,Springcloud学习笔记.md,Springcloud学习笔记.md,Spring...
跟我学spring3的pdf,便于学习,供大家分享,一起学习
主要介绍了Spring Bean的初始化和销毁,结合实例形式详细分析了Spring Bean的初始化和销毁相关配置、使用方法及操作注意事项,需要的朋友可以参考下
跟我学Spring3
跟我学spring3(1-7).pdf 跟我学spring3(8-13).pdf 跟我学spring3-源码.rar 跟我学spring3-项目源码(pointShop)(基于注解).rar 跟我学spring3-项目源码(pointShop)(基于XML配置文件).rar
学习spring总结的笔记 希望对初学者有所帮助
spring指南学习笔记
3、通过spring的xml bean配置或bean注解指定初始化方法,如下面实例的initMethod方法通过@bean注解指定。 销毁的时候实现的方法 1、通过java提供的@PreDestroy注释; 2、通过实现spring提供的DisposableBean接口,并...
Spring6学习笔记,师承老杜
三更springsecurity学习笔记
1.32 【第七章】 对JDBC的支持 之 7.3 关系数据库操作对象化 ——跟我学spring3 . . . . . . . . . . . . . .324 1.33 【第七章】 对JDBC的支持 之 7.4 Spring提供的其它帮助 ——跟我学spring3【私塾在线原 创】 ...