`
DXL_xiaoli
  • 浏览: 71780 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

体验spring(三)---Bean的生命周期及作用域

阅读更多

 

Bean 的生命周期及作用域

 

BeanFactory Bean 的生命周期:

1、    容器寻找 Bean 的定义信息并将其实例化。

2、   使用依赖注入, spring 按照 Bean 定义信息配置 Bean 的所有属性。

3、   如果 Bean 实现了 BeanNameAware 接口,工厂调用 Bean setBeanName() 方法传递 Bean id

4、   如果 Bean 实现了 BeanFactoryAware 接口,工厂调用 setBeanFactory() 方法传入工厂自身。

5、   如果有 BeanPostProcessor Bean 关联,那么其 postProcessBeforeInitialization() 方法将调被调用

6、   如果 Bean 指定了 init method 方法,将被调用

7、   如果有 BeanPostProcess Bean 关联,那么其 postProcessAfterInitialization() 方法将被调用。

Bean 在加载容器时创建 Bean 初始化时执行 init-method 方法、 Bean 被关闭时执行 destory-method 方法。

 

消除 BeanFactory bean 的方法:

1、    如果 Bean 实现了 DisposableBean 接口, destory() 方法被调用

2、   如指定了定制的销毁方法,就调用这个方法

注: Bean spring 应用上下文中的生命周期与在 BeanFactory 中的生命周期只有一点不同:即 Bean 实现了 ApplicationContextAware 接口, setApplicationContext() 放法会被调用。

案例:简单介绍Bean的生命周期

public class CycleLifeService implements BeanNameAware, BeanFactoryAware,BeanPostProcessor{
 private String say;//say的属性
 private Test test;//java类的实例

public void setSay(String say) {
	this.say = say;
}

public Test getTest() {
	return test;
}

public void setTest(Test test) {
	this.test = test;
}
public void test(){
	System.out.println("-------------"+this.say);
}
//初始化的方法
public  void init(){
	System.out.println("初始化方法....");
	
}
//销毁的方法
public void  destroy(){
	System.out.println("销毁方法.....");
}
//设置Bean的name
@Override
public void setBeanName(String name) {
	System.out.println("===="+name);
	
}

@Override
public void setBeanFactory(BeanFactory arg0) throws BeansException {
// 设置一个beanFactory
	System.out.println(BeanFactory.class);
	
}

@Override
public Object postProcessAfterInitialization(Object bean, String beanName)
		throws BeansException {
	System.out.println("------后"+beanName);
	return bean;
}

@Override
public Object postProcessBeforeInitialization(Object bean, String beanName)
		throws BeansException {
    System.out.println("--------前"+beanName);
	return bean;
}
}
Test的类
public class Test {
	public void test() {
		System.out.println("======================");

	}
}
applicationContext.xml文件
文件中定义的初始化的方法和销毁的方法
<bean id="cycleLifeService" class="cn.csdn.cyclelife.CycleLifeService"
		init-method="init" destroy-method="destroy">
		<property name="say">
			<value>你好!!!</value>
		</property>

		<property name="test">
			<ref bean="test"></ref>
		</property>

	</bean>
<bean id="test" class="cn.csdn.cyclelife.Test"/>
其中的init-method方法在Bean实例化时被调用;destory-method方法在Bean从容器删除之前被调用

 

Bean 的作用域

Spring Framework 支持五种作用域(其中有三种只能用在基于 web Spring ApplicationContext )。

1 singleton :在每个Spring IoC 容器中一个bean 定义对应一个对象实例。( 在初始化容器时,创建一个 bean 的实例对象

2 prototype : 一个bean 定义对应多个对象实例。( 在每次请求该 bean 时,都会创建一个 bean 的实例对象 )

3 request :在一次HTTP 请求中,一个bean 定义对应一个实例;即每次HTTP 请求将会有各自的bean 实例,它们依据某个bean 定义创建而成。该作用域仅在基于webSpring ApplicationContext 情形下有效。

4 session : 在一个HTTP Session 中,一个bean 定义对应一个实例。该作用域仅在基于webSpring ApplicationContext 情形下有效。

5 global session :在一个全局的HTTP Session 中,一个bean 定义对应一个实例。典型情况下,仅在使用portlet context 的时候有效。该作用域仅在基于webSpring ApplicationContext 情形下有效。

我们在 spring 中常用的两种作用域: singleton prototype 一下主要详细介绍该两种作用域。

第一种: 
Singleton作用域:
当把一个bean定义设置为singlton作用域时,Spring IoC容器只会创建该bean定义的唯一实例。这个单一实例会被存储到单例缓存(singleton cache)中,并且所有针对该bean的后续请求和引用都将返回被缓存的对象实例。
<bean id="studentServiceImpl" class="cn.csdn.service.StudentServiceImpl"
		scope="singleton">
		<property name="studentDaoImpl" ref="studentDaoImpl">

		</property>
	</bean>

public class StudentServiceImpl {

	private StudentDaoImpl studentDaoImpl;

	public void setStudentDaoImpl(StudentDaoImpl studentDaoImpl) {
		this.studentDaoImpl = studentDaoImpl;
	}

	@Override
	public void insert() {
		studentDaoImpl.insert();

	}

}

public class StudentDaoImpl {

	@Override
	public void insert() {
		System.out.println("插入成功.....");
		
	}

}
第二种:
Prototype作用域:
Prototype作用域的bean会导致在每次对该bean请求(将其注入到另一个bean中,或者以程序的方式调用容器的getBean()方法)时都会创建一个新的bean实例。根据经验,对所有有状态的bean应该使用prototype作用域,而对无状态的bean则应该使用singleton作用域。

注:Spring不能对一个prototype bean的整个生命周期负责:容器在初始化、配置、装饰或者是装配完一个prototype实例后,将它交给客户端,随后就对该prototype实例不闻不问了。不管何种作用域,容器都会调用所有对象的初始化生命周期回调方法,而对prototype而言,任何配置好的析构生命周期回调方法都将不会被调用。清除prototype作用域的对象并释放任何prototype bean所持有的昂贵资源,都是客户端代码的职责。
  <!-- 使用singleton模式创建bean实例对象 -->

    <bean id="cityService" class="cn.csdn.service.CityService" scope="prototype"></bean>

 

 

补充:延迟初始化:  

   依赖:

    延迟初始化 :lazy-init:false true;

    false: 加载容器时 初始化对象

    true :第一次调用时初始化对象

   

    在根标签中有一个 default-lazy-init 的属性 如果该属性设置为 true 该文件中的所有 bean 都会被延迟初始化。

   

    注意:如果在 lazy-init ='false' bean 中,引用 lazy-init ="true" bean, 那么 lazy-init 就失去了延迟的效果。

  

      <

2
2
分享到:
评论
1 楼 Onion_Lou 2011-04-21  
文章写的不错、
提点建议、
你用FCK的代码工具编辑JAVA代码、文章会更整洁一点

相关推荐

    详解Spring中Bean的生命周期和作用域及实现方式

    Spring中Bean的生命周期和作用域及实现方式 Spring是一个非常流行的Java应用程序框架,它提供了一个灵活的机制来管理Bean的生命周期和作用域。Bean的生命周期和作用域是Spring框架中两个非常重要的概念,它们决定了...

    spring bean的生命周期

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

    Spring框架中Bean的生命周期 Spring中Bean有几种作用域

    Spring中的Bean生命周期主要分为两个阶段:容器管理阶段和用户自定义阶段。在容器管理阶段,Spring容器负责Bean的实例化、属性注入、初始化、使用和销毁。而在用户自定义阶段,开发者可以通过定义回调方法或使用特定...

    Spring bean生命周期demo

    接下来,我们将深入探讨Spring Bean生命周期的各个阶段,并通过具体的示例来演示。 1. **配置阶段** 在Spring容器初始化时,它会读取配置文件(如XML或Java配置),解析Bean定义,包括其依赖关系、初始化方法、...

    spring-aware接口实现与bean作用域(spring多容器层面)

    这些作用域定义了Bean的生命周期和创建行为: 1. **单例(Singleton)**:默认作用域,每个容器中只有一个实例,适合无状态的服务。 2. **原型(Prototype)**:每次请求都会创建一个新的Bean实例,适用于有状态的...

    spring的bean作用域

    在Spring框架中,Bean的作用域是管理Bean实例创建和存活范围的重要概念。Bean的作用域决定了在特定上下文中,Spring容器如何管理和提供Bean的实例。在Spring中,有五种主要的Bean作用域: 1. **Singleton作用域**:...

    Spring的bean生命周期

    Bean生命周期的理解对于优化应用性能和理解Spring内部工作原理至关重要。这里我们将深入探讨Spring的Bean生命周期、容器周期以及工厂周期。 首先,让我们从Bean生命周期开始。在Spring中,Bean的生命周期包括以下几...

    Spring--2.Spring 中的 Bean 配置-2-1

    - 在Spring中,一个Bean代表了一个Java对象,它由Spring容器管理,包括其生命周期和依赖关系。 - Bean的定义通常在XML配置文件中完成,如`beans.xml`,通过`&lt;bean&gt;`标签进行声明。例如: ```xml &lt;bean id=...

    详解Spring中bean的作用域

    Spring 中 bean 的作用域是指 Spring IoC 容器中 bean 的生命周期和实例化方式。bean 的作用域决定了 bean 的实例化和生命周期的管理方式。在 Spring 中,bean 的作用域可以分为五种:singleton、prototype、...

    浅谈Spring中Bean的作用域、生命周期

    Spring中Bean的作用域和生命周期 Spring框架中,Bean的作用域和生命周期是两个非常重要的概念,了解这两个概念对深入理解Spring框架的工作机理具有非常重要的意义。本文将对Spring中Bean的作用域和生命周期进行详细...

    Spring Bean生命周期&BeanDefinitions1

    Spring框架是Java应用开发中的一个核心组件,尤其在企业级应用中广泛使用。Spring通过其IoC(Inversion of Control,控制反转)容器管理Bean的生命周期,...理解Bean生命周期对于有效管理和优化Spring应用至关重要。

    SPRING FRAMEWORK BEAN作用域和生命周期原理解析

    SPRING FRAMEWORK BEAN作用域和生命周期原理解析 Spring Framework 是一个流行的 Java Web 应用程序框架,它提供了一个强大的依赖注入机制,称为 Bean 容器。Bean 容器管理着应用程序中的所有对象,并提供了一些...

    Spring--2.Spring 中的 Bean 配置-2-2

    在Spring框架中,Bean配置是核心概念之一,它关乎到对象的创建、初始化、依赖注入以及生命周期管理。在"Spring--2.Spring 中的 Bean 配置-2-2"这个主题下,我们将深入探讨如何在Spring中进行Bean的详细配置。 1. **...

    Spring Bean 的生命周期

    本篇将详细阐述Spring Bean生命周期的各个阶段,以及如何记忆和深入理解这一过程。 首先,Spring Bean的生命周期可以分为两个主要阶段:容器初始化阶段和容器销毁阶段。 在容器初始化阶段,Spring Bean会经历以下...

    spring-context-4.2.xsd.zip

    此外,`&lt;bean&gt;`元素还支持通过`init-method`和`destroy-method`属性指定bean的初始化和销毁方法,以进行自定义的生命周期管理。 `spring-context-4.2.xsd`还定义了处理bean作用域(scope)、AOP代理(proxy)、事件...

    深入了解Spring中Bean的作用域和生命周期

    深入了解Spring中Bean的作用域和生命周期 在 Spring 框架中,Bean 的作用域和生命周期是两个非常重要的概念,它们决定了 Bean 的实例化和生命周期。了解 Spring 中 Bean 的作用域和生命周期是非常重要的,这将有助...

    spring bean life cycle

    在Spring框架中,Bean生命周期是核心概念之一,它涉及到Bean的创建、初始化、使用和销毁等阶段。了解和掌握Bean生命周期对于开发高质量的Spring应用至关重要。以下是对Spring Bean生命周期的详细解析。 首先,Bean...

    Spring--2.Spring 中的 Bean 配置-3

    这些方法会在Bean生命周期的特定时刻被调用。 最后,Bean之间的依赖关系可以通过XML中的`ref`属性,Java配置中的`@Autowired`,或注解配置中的构造函数、setter方法、字段注入等方式来解决。Spring提供了基于类型、...

    Spring框架系列(8) - Spring IOC实现原理详解之Bean实例化(生命周期,循环依赖等).doc

    Spring 框架系列(8)- Spring IOC 实现原理详解之 Bean 实例化(生命周期、循环依赖等) 本文主要研究 Spring 框架中 Bean 的实例化过程,包括 Bean 的生命周期和循环依赖问题的解决方案。在 Spring 框架中,Bean ...

    基于java的企业级应用开发:Bean的生命周期.ppt

    实例化过程是Bean生命周期的起点。 2. **依赖注入**: - 在Bean实例化后,Spring会执行依赖注入(Dependency Injection,DI),将所需的属性值注入到Bean中。这可以通过setter方法、构造函数或者字段注入实现。 3...

Global site tag (gtag.js) - Google Analytics