`

跟我学Spring3 学习笔记七 初始化与销毁

 
阅读更多

最后 遗留一个问题,继续探索中....

 

 

跟我学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 楼 sblig 2012-10-19   引用删除
问题已经找到,是自己的问题

depends-on="lazyinitDi" 这个去掉

输出的结果就变了

初始化 ApiDecorator   使用lazy-init属性Spring对Bean进行了预初始化
初始化 DiLazyInit          
say DiLazyInit


初始化 DiLazyInit
初始化 ApiDecorator
say ApiDecorator
say DiLazyInit

 

0
0
分享到:
评论
1 楼 sblig 2012-10-19  
问题已经找到,是自己的问题

depends-on="lazyinitDi" 这个去掉

输出的结果就变了

初始化 ApiDecorator   使用lazy-init属性Spring对Bean进行了预初始化
初始化 DiLazyInit         
say DiLazyInit


初始化 DiLazyInit
初始化 ApiDecorator
say ApiDecorator
say DiLazyInit

相关推荐

    Springcloud学习笔记.md

    Springcloud学习笔记.md,Springcloud学习笔记.md,Springcloud学习笔记.md,Springcloud学习笔记.md,Springcloud学习笔记.md,Springcloud学习笔记.md,Springcloud学习笔记.md,Springcloud学习笔记.md,Spring...

    Spring Bean的初始化和销毁实例详解

    Spring Bean的初始化和销毁实例详解 Spring Bean的初始化和销毁是Spring框架中一个非常重要的概念,它们都是Bean生命周期中不可或缺的一部分。在Spring框架中,我们可以使用多种方式来控制Bean的初始化和销毁,以下...

    跟我学spring3

    通过《跟我学Spring3》的8-13章节,你可能会深入到更多高级主题,例如Spring与AspectJ的集成、Spring与缓存的整合(如 Ehcache 或 Redis)、Spring的测试支持,以及Spring与其他流行框架(如MyBatis、Quartz等)的...

    Spring框架学习笔记

    在Spring中,应用程序的组件被称为Bean,这些Bean被定义在配置文件中,由Spring容器管理其生命周期,包括实例化、初始化、装配和销毁。Bean可以通过XML、注解或者Java配置来定义。 五、Spring MVC Spring MVC是...

    开涛 跟我学spring3 pdf+源码

    这本书分为两部分PDF文档:"开涛 跟我学spring3(1-7).pdf" 和 "开涛 跟我学spring3(8-13).pdf",分别覆盖了Spring框架的核心概念和技术,旨在帮助读者全面理解并掌握Spring框架的应用。 在第一部分(1-7章)中,...

    跟我学Spring3

    《跟我学Spring3》这本书是针对Java开发人员深入学习Spring框架第三版的一份教程。Spring作为Java企业级应用开发中的核心框架,它以其强大的功能、灵活性和模块化设计深受开发者喜爱。Spring3版本在前一版本基础上...

    开涛系列—跟我学spring3 pdf+学习源码+项目源码

    跟我学spring3.pdf 跟我学spring3-源码.rar 跟我学spring3-项目源码(pointShop)(基于注解).rar 跟我学spring3-项目源码(pointShop)(基于XML配置文件).rar

    Spring bean初始化及销毁你必须要掌握的回调方法.docx

    下面将详细介绍如何通过不同方式定义Spring Bean的初始化和销毁回调方法。 **初始化回调方法** 1. **@PostConstruct注解** 这个Java标准注解用于标记一个方法,该方法将在对象完全构造后但在业务逻辑执行前被调用...

    跟我学spring3-源码.

    《跟我学Spring3-源码》教程是一份深入解析Spring框架3.x版本核心源码的教育资源,适合对Java和J2EE技术有一定基础的开发者学习。本教程旨在帮助读者理解Spring框架的工作原理,提高在实际项目中的应用能力。通过...

    跟我学spring3 .pdf

    《跟我学Spring3》这本书是针对Spring框架进行深入解析的一本教程,涵盖了Spring的核心特性,包括IoC(Inversion of Control,控制反转)、DI(Dependency Injection,依赖注入)、AOP(Aspect-Oriented Programming...

    Spring6学习笔记

    Spring6学习笔记,师承老杜

    springsecurity学习笔记

    在"springsecurity学习笔记"中,你可能会涉及以下主题: - Spring Security的基本配置,包括web安全配置和全局安全配置。 - 如何自定义认证和授权流程,比如实现自定义的AuthenticationProvider和...

    跟开涛学Spring

    1.32 【第七章】 对JDBC的支持 之 7.3 关系数据库操作对象化 ——跟我学spring3 . . . . . . . . . . . . . .324 1.33 【第七章】 对JDBC的支持 之 7.4 Spring提供的其它帮助 ——跟我学spring3【私塾在线原 创】 ...

    Spring学习笔记(精华全记录)

    ### Spring学习笔记(精华全记录) #### Spring框架概述 Spring框架源自Rod Johnson的个人项目,最初于2002年末发布。Spring并非一开始就作为一个完整的框架出现,而是从一个项目逐步发展而来。随着项目的成熟,...

    SpringCloud学习笔记

    5. **自动装配**:自动配置是SpringBoot的一大特色,它通过`classpath:/META-INF/spring.factories`中的配置信息进行初始化。开发者可以通过`@EnableAutoConfiguration`注解启用自动配置,而这个注解通常在`@...

    Spring Bean创建初始化流程.docx

    整个流程中,Spring不仅创建了Bean,还管理了Bean的生命周期,包括依赖注入、初始化和销毁等。这种自动化管理使得开发者可以专注于业务逻辑,而不用关心对象的创建和管理细节。Spring的IoC容器使得应用更加灵活和...

    详解Spring 中如何控制2个bean中的初始化顺序

    Spring 中控制 2 个 bean 的初始化顺序 在 Spring 框架中,控制多个 bean 的初始化顺序是一个常见的问题。本篇文章将详细介绍如何控制 2 个 bean 的初始化顺序,提供了多种实现方式,并分析了每种方式的优缺。 ...

    Spring学习笔记( spring视频笔记)

    Spring学习笔记( spring视频笔记)

    狂神springcloud学习笔记加代码

    狂神springcloud学习笔记加代码 笔记可以看:https://www.kuangstudy.com/bbs/1374942542566551554#header4 视频链接:https://www.bilibili.com/video/BV1jJ411S7xr

    跟开涛学spring3

    《跟开涛学Spring3》是一本专注于Spring框架学习的教程,由知名IT教育专家开涛编著。这本书以其通俗易懂的语言和深入浅出的讲解方式,深受初学者和有经验的开发者喜爱,旨在帮助读者全面掌握Spring3的核心概念和技术...

Global site tag (gtag.js) - Google Analytics