`
Luob.
  • 浏览: 1588796 次
  • 来自: 上海
社区版块
存档分类
最新评论

Spring Bean的管理

阅读更多
目录
1.spring 实例化 bean 的几种方式
2.spring 中bean 的作用域
3.spring 管理的bean 在什么时候初始化 和 销毁
4.spring bean 的 init-method  destroy-method

1.下面 我们来看看spring的 实例化bean的 几种方式
1.使用类构造器实例化bean
   <!--1.使用类构造器实例化bean--->
  <bean id="personService" class="com.person.service.impl.PersonServiceBean">
  </bean>


2 使用 静态工厂方法来实例化
<!-- 2.使用 静态工厂方法来实例化 bean -->
	<bean id="personService2" class="com.person.service.impl.PerssonServiceFactory" factory-method="createPersonService"/>
	

package com.person.service.impl;

import com.person.service.PersonService;

public class PerssonServiceFactory {
	//使用这个工厂中的静态方法
	public static PersonService createPersonService(){
		return new PersonServiceBean();
	}
}


3. 使用 实例工厂方式来实例化bean
<!-- 使用 实例工厂方式来实例化bean -->
	<bean id="perssonServiceFactory" class="com.person.service.impl.PerssonServiceFactory"/>
	<bean id="personService3" factory-bean="perssonServiceFactory" factory-method="createPersonService2"/>


package com.person.service.impl;

import com.person.service.PersonService;

public class PerssonServiceFactory {
	
	//使用 静态工厂方法来实例化 bean
	public static PersonService createPersonService(){
		return new PersonServiceBean();
	}
	
	//使用 实例工厂方式来实例化bean
	public PersonService createPersonService2(){
		return new PersonServiceBean();
	}
}

//测试
	@Test
	public void init3(){
		ApplicationContext ctx=new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
		
		
		//方法一  获取服务层对象
		PersonService personService=(PersonService)ctx.getBean("personService2");
		//方法二
		PersonService personService1=ctx.getBean("personService3",PersonService.class);
		
		personService.save();
		personService1.save();
	}


2.弄了这么多 那么spring 中每次 getBean();这个方法返回的对象  是同一个吗??
@Test //测试 spring 容器中的 bean 的作用域
	public void init4(){
		ApplicationContext ctx=new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
		//方法一  获取服务层对象
		PersonService personService=(PersonService)ctx.getBean("personService");
		PersonService personService1=(PersonService)ctx.getBean("personService");
		//方法二
		PersonService personService2=ctx.getBean("personService",PersonService.class);
		
		System.out.println(personService==personService1); //true
		System.out.println(personService1==personService2); //true 
		 
	}

//以上 说明 是同一个对象 ,说明了spring 默认 的bean 是 单例模式 Singleton

spring bean 的作用域 scope

Singleton
在每个Spring IOC容器中一个bean的定义只有一个对象实例,默认情况下,会在容器服务器启动时初始化bean,但我们可以制定Bean 节点 lazy-init="true" 来延迟初始化bean,这个时候,只有第一个获取bean才会初始化bean.如:
<bean id="XXX" class="com.person.serivce.impl.PersonServiceBean" lazy-init="true"/>
如果 相对 spring文件中的所有bean 都 延迟初始化,可以在根节点beans 设置  default-lazy-init="true" 如下:
<beans  default-init="true"/>


prototype:每次从容器获取的bean 都是一个新的对象. (原型)

//对于 web 应用来说
request
session
global session

//修改spring 配置 来测试
<!-- 使用 静态工厂方法来实例化 bean 加入 scope 范围-->  
	<bean id="personService2" class="com.person.service.impl.PerssonServiceFactory" factory-method="createPersonService" scope="prototype"/>

@Test //测试 spring 容器中的 bean 的作用域
	public void init5(){
		ApplicationContext ctx=new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
		//方法一  获取服务层对象
		PersonService personService=(PersonService)ctx.getBean("personService2");
		PersonService personService1=(PersonService)ctx.getBean("personService2");
		//方法二
		PersonService personService2=ctx.getBean("personService2",PersonService.class);
		
		System.out.println(personService==personService1); //false
		System.out.println(personService1==personService2); //false 
	}


//说明 设置 scope="prototype" 后变成了 原型  每次 获取都是不同的对象

3.看看 spring 在什么时候 初始化bean  (在 配置 的bean对应的类中 加个 构造方法 就可以测试了)

1 先测试  singleton 范围
package com.person.service.impl;

import com.person.service.PersonService;

public class PersonServiceBean implements PersonService {
	
	//测试 spring 在什么时候初始化 bean
	public PersonServiceBean() {
		System.out.println("我被实例化了!");
	}
	
	public void save(){
		System.out.println("我就是save方法!");
	}
}

@Test //测试 spring的 初始化
	public void init(){
		ApplicationContext ctx=new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
		
	}

// 发现 打印 出了 "我被实例化了!"  说明 spring 默认情况下 是加载 spring配置文件的时候就初始化了 bean

2.在来测试 scope="prototype"

	@Test //测试 spring的 初始化
	public void init(){
		ApplicationContext ctx=new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
		
		System.out.println("开始调用 getBean方法");
		//方法一  获取服务层对象
		PersonService personService=(PersonService)ctx.getBean("personService");
		//方法二
		PersonService personService1=ctx.getBean("personService",PersonService.class);
		
		
		//personService.save();
		//personService1.save();
	}


// 发现 打印出 "开始调用 getBean方法" 之后 才打印出 "我被实例化了!"  "我被实例化了!"
// 说明 scope="prototype" 是在 getBean方法后  才被实例化

3.再来看延迟初始化 lazy-init="true";
	<!-- 使用 延迟初始化  -->
	<bean id="personService" class="com.person.service.impl.PersonServiceBean" lazy-init="true">
	</bean>



	@Test //测试 spring的 初始化
	public void init(){
		ApplicationContext ctx=new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
		
		System.out.println("开始调用 getBean方法");
		//方法一  获取服务层对象
		PersonService personService=(PersonService)ctx.getBean("personService");
		//方法二
		PersonService personService1=ctx.getBean("personService",PersonService.class);
		
		
		//personService.save();
		//personService1.save();
	}

// 发现 打印出 "开始调用 getBean方法" 之后 才打印出 "我被实例化了!" 

说明 lazy-init="true" 也是在 getBean方法后才被初始化   但是 使用的是同一个对象 所以 只打印出了一句 "我被实例化了!"  .而scope="prototype" 是原型 所以 打印出了 两句  "我被实例化了!" .

4.如果 我们想在 spring 初始化bean实例后  执行一个方法 , 或者 在  bean销毁后 执行一个方法 (比如 资源的打开  和 使用完后 资源的关闭:写到这 大家是不是 就想到了 打开数据库连接 和 关闭呀)

package com.person.service.impl;

import com.person.service.PersonService;

public class PersonServiceBean implements PersonService {
	
	//初始化后 执行的方法
	public void init(){
		System.out.println("打开数据库的连接");
	}
	
	//销毁后执行的方法
	public void destroy(){
		System.out.println("关闭 数据的连接资源");
	}
	
	//测试 spring 在什么时候初始化 bean
	public PersonServiceBean() {
		System.out.println("我被实例化了!");
	}
	
	public void save(){
		System.out.println("我就是save方法!");
	}
}


使用 这两个属性  init-method  , destroy-method
<!-- 使用个 实例工厂方式来实例化bean -->
	<bean id="perssonServiceFactory" class="com.person.service.impl.PerssonServiceFactory"/>
	<bean id="personService3" factory-bean="perssonServiceFactory" factory-method="createPersonService2" init-method="init" destroy-method="destroy"/>


@Test  //测试 spring 的 init-method  , destroy-method
	public void init6(){
		//注意这里  ApplicationContext 接口 没有 close 方法 只有 用  父接口 
		AbstractApplicationContext ctx=new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
		//方法二
		PersonService personService1=ctx.getBean("personService3",PersonService.class);
		personService1.save();
		ctx.close(); 
	}

// 发现  init 和 destroy 方法 都执行了
1
1
分享到:
评论
1 楼 liuzl121 2012-12-14  
顶下,谢楼主的总结,对于我这样的初学者很有用,希望楼主继续总结。

相关推荐

    Spring bean 管理

    Spring框架是Java企业级应用开发的事实标准,它通过依赖注入(DI)和面向切面编程(AOP)来...需要注意的是,无论是哪种方式,理解Spring Bean管理的原理和生命周期,对于开发高质量的Java企业级应用都是必不可少的。

    Spring Bean管理注解方式代码实例

    Spring Bean 管理注解方式代码实例 Spring Bean 管理注解方式代码实例是 Spring 框架中的一种常见的 Bean 管理方式。通过使用注解的方式,可以简化 Bean 的配置和管理过程。这篇文章将详细介绍 Spring Bean 管理...

    spring bean的生命周期

    - **XML配置**:在传统的Spring应用中,Bean的定义通常写在XML配置文件中,如`springbean-xml`中的配置。 - **注解配置**:使用`@Component`,`@Service`,`@Repository`和`@Controller`注解标记类,配合`@...

    spring bean XML配置入门

    在本文中,我们将深入探讨Spring框架中的Bean XML配置,这是Spring的核心特性之一,它允许我们定义、管理和装配应用中的对象。我们将围绕以下知识点展开: 1. **Spring框架基础**: Spring是一个开源的Java平台,...

    Spring Bean创建初始化流程.docx

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

    Spring Bean重复执行两次(实例被构造两次)问题分析

    在Spring框架中,Bean的生命周期管理是其核心特性之一,然而有时我们可能会遇到Spring Bean重复执行两次的问题,即实例被构造两次。这个问题可能是由多种原因引起的,涉及到Spring的初始化过程和容器的行为。以下是...

    普元eos-springbean开发

    SpringBean是Spring框架的核心概念之一,它是Spring IoC容器管理的对象。在普元EOS平台中,SpringBean同样扮演着重要角色,用于封装业务逻辑、数据访问等功能。通过合理地设计和配置SpringBean,可以极大地提高开发...

    spring bean life cycle

    总的来说,Spring Bean生命周期的理解和灵活运用,能帮助我们更好地控制Bean的行为,实现更高效、更可控的依赖管理和资源管理。通过深入学习源码,我们可以进一步了解Spring如何实现这些功能,从而提升我们的开发...

    spring bean 属性总结

    在Spring中,核心概念之一就是Bean,它是一个简单的Java对象,由Spring IoC容器管理。Spring通过XML配置文件或注解来定义、配置和管理Beans。下面将深入探讨`&lt;beans&gt;`、`&lt;bean&gt;`及其属性,以及其他相关的配置元素。 ...

    实例化Spring bean的两种工厂方法

    在Spring框架中,bean的实例化是其核心功能之一,它允许我们管理应用程序中的对象生命周期。本篇将详细探讨两种工厂方法——实例工厂方法和静态工厂方法,用于创建Spring Bean。 首先,我们要理解Spring Bean的概念...

    springBean加载过程源码解析文档,附有代码类名和行数

    在 Spring Boot 应用程序中,SpringApplication 负责加载和管理 Bean。 SpringApplication 初始化 在 SpringApplication 运行之前,首先需要初始化 SpringApplication 实例。这个过程中,SpringApplication 会创建...

    Spring Bean 加载顺序 .

    对于Prototype作用域的Bean,Spring不会自动管理销毁,需要由用户负责。 在实际应用中,理解这些步骤有助于优化Bean的加载和管理,避免依赖问题,提高应用性能。例如,通过调整Bean的加载顺序,可以控制某些服务的...

    java *spring工具类 方便在非spring管理环境中获取bean

    java *spring工具类 方便在非spring管理环境中获取beanjava *spring工具类 方便在非spring管理环境中获取beanjava *spring工具类 方便在非spring管理环境中获取beanjava *spring工具类 方便在非spring管理环境中获取...

    spring bean的生命周期测试代码

    在Spring框架中,Bean的生命周期管理是其核心特性之一,它允许开发者控制Bean从创建到销毁的整个过程。本资源提供了在Spring 4.2环境下关于Bean生命周期的测试代码,帮助我们深入理解这一关键概念。 首先,让我们...

    SpringBean的生命周期.mdj

    SpringBean的生命周期.mdj

    Spring Bean基本管理实例详解

    主要介绍了Spring Bean基本管理,以实例形式较为详细的分析了Spring Bean的相关使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下

    Spring Bean简单应用实例

    Spring通过IoC(Inversion of Control,控制反转)和DI(Dependency Injection,依赖注入)来管理这些Bean。在这个"Spring Bean简单应用实例"中,我们将深入理解这两个概念以及如何在实际应用中使用它们。 首先,...

    Spring的Bean配置

    在Spring中,Bean是应用中的对象,它们由Spring IoC容器负责创建、管理和装配。Bean配置是定义这些对象如何被创建和如何相互关联的过程。 **IoC(Inversion of Control)和DI(Dependency Injection)**: IoC是...

    Spring实例化Bean顺序

    在Spring框架中,Bean的实例化顺序是一个关键概念,它涉及到如何管理和协调多个Bean的创建与依赖关系。这里,我们主要探讨的是Spring如何通过其IoC(Inversion of Control)容器来实例化Bean,并理解其背后的逻辑。 ...

    Spring中关于Bean的管理的课件

    在Spring框架中,Bean的管理是其核心特性之一,它涉及到Bean的创建、初始化、装配以及销毁等整个生命周期过程。本课件主要涵盖了以下几个关键知识点: 1. **控制反转(IoC)和依赖注入(DI)**:Spring的核心设计...

Global site tag (gtag.js) - Google Analytics