spring实战装配bean之Bean的作用域以及初始化和销毁Bean

1.Bean的作用域

所有的spring bean默认都是单例。当容器分配一个Bean时,不论是通过装配还是调用容器的getBean()方法,它总是返回Bean的同一个实例。有时候需要每次请求时都获得唯一的Bean实例,那么就需要覆盖Spring默认的单例配置。当在Spring中配置<bean>元素时,可以为bean声明一个作用域。为了让spring在每次请求时都为bean产生一个新的实例,只需要配置bean的scope属性为prototype即可。如下所示:

<bean id="ticket"
class="com.springinaction.springidol.Ticket" scope="prototype" />

通过将scope属性设置为prototype,就可以保证每一个装配了Ticket Bean的人都将获得不同的实例。

除了prototype,spring还提供了其他几个作用域选项,如下表所示:

大多数情况下,只需要选择默认的singleton 作用域即可,但是如果使用Spring 作为工厂来创建领域对象新实例时,prototype 作用域就非常有用。如果领域对象的作用域配置为prototype,我们在Spring 中可以很容易地配置它们,就像配置其他Bean 一样。Spring 保证每次请求一个prototype Bean 时总是返回一个独一无二的实例。

细心的读者会发现Spring 有关单例的概念限于Spring 上下文的范围内。不像真正的单例,在每个类加载器中保证只有一个实例。Spring 的单例Bean 只能保证在每个应用上下文中只有一个Bean 的实例。没有人可以阻止你使用传统的方式实例化同一个Bean,或者你甚至可以定义几个<bean> 声明来实例化同一个Bean。

2.初始化和销毁Bean

当实例化一个Bean 时,可能需要执行一些初始化操作来确保该Bean 处于可用状态。同样地,当不再需要Bean,将其从容器中移除时,我们可能还需要按顺序执行一些清除工作。为了满足初始化和销毁Bean 的需求,Spring 提供了Bean 生命周期的钩子方法。

2.1 init-method 和destroy-method:

为Bean 定义初始化和销毁操作, 只需要使用init-method 和destroy-method参数来配置<bean> 元素。init-method 属性指定了在初始化Bean 时要调用的方法。类似地,destory-method 属性指定了Bean 从容器移除之前要调用的方法。如下所示:

<bean id="auditorium"
class="com.springinaction.springidol.Auditorium"
init-method="turnOnLights"
destroy-method="turnOffLights"/>

当我们使用这种方式配置时,auditorium Bean 实例化后会立即调用turnOn-Lights() 方法,让它有机会点亮表演场地。在该Bean 从容器移除和销毁前,会调用turnOffLights() 方法将灯关闭。

2.2 InitializingBean 和DisposableBean:

为Bean 定义初始化和销毁方法的另一种可选方式是,让Bean 实现Spring 的InitializingBean和DisposableBean 接口。Spring 容器以特殊的方式对待实现这两个接口的Bean,允许它们进入Bean 的生命周期。InitializingBean 声明了一个afterPropertiesSet()方法作为初始化方法。而DisposableBean 声明了一个destroy()方法,该方法在Bean 从应用上下文移除时会被调用。使用这些生命周期接口的最大好处就是Spring 能够自动检测实现了这些接口的Bean,而无需额外的配置。实现这些接口的缺点是Bean 与Spring 的API 产生了耦合。就因为这条理由,所以还是推荐使用init-method 和destory-method 属性来初始化和销毁Bean。唯一可能使用Spring 的生命周期接口的场景是,开发一个明确在Spring 容器内使用的框架Bean。

2.3 默认的init-method 和destory-method:

如果在上下文中定义的很多Bean 都拥有相同名字的初始化方法和销毁方法,你没必要为每一个Bean 声明init-method 和destory-method 属性。幸运的是,你可以使用<beans> 元素的default-init-method 和default-destorymethod属性:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"
default-init-method="turnOnLights"
default-destroy-method="turnOffLights"> ...
</beans>

default-init-method 属性为应用上下文中所有的Bean 设置了共同的初始化方法。类似的是,default-destory-method 为应用上下文中所有的Bean 设置了一个共同的销毁方法。在本示例中,我们可以要求Spring 在初始化应用上下文中的Bean 时调用turnOnLights(),在销毁Bean 时调用turnOffLights()(如果这些方法存在的话,否则什么都不会发生)。

时间: 2024-10-08 20:04:40

spring实战装配bean之Bean的作用域以及初始化和销毁Bean的相关文章

通过Spring @PostConstruct 和 @PreDestroy 方法 实现初始化和销毁bean之前进行的操作

关于在spring  容器初始化 bean 和销毁前所做的操作定义方式有三种: 第一种:通过@PostConstruct 和 @PreDestroy 方法 实现初始化和销毁bean之前进行的操作 第二种是:通过 在xml中定义init-method 和  destory-method方法 第三种是:通过bean实现InitializingBean和 DisposableBean接口 下面演示通过  @PostConstruct 和 @PreDestory 1:定义相关的实现类: package

Spring实现初始化和销毁bean之前进行的操作,三种方式

关于在spring  容器初始化 bean 和销毁前所做的操作定义方式有三种: 第一种:通过@PostConstruct 和 @PreDestroy 方法 实现初始化和销毁bean之前进行的操作 第二种是:通过 在xml中定义init-method 和  destory-method方法 第三种是:通过bean实现InitializingBean和 DisposableBean接口 下面演示通过  @PostConstruct 和 @PreDestory 1:定义相关的实现类: [java] v

在spring容器中定义初始化和销毁bean前所做的操作,有三种方式

1.使用注解,通过@PostConstruct 和 @PreDestroy 方法 实现初始化和销毁bean之前进行的操作 package com.luoq.test.annotation.init; import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; public class TestBean { private String message; public String getMessage()

Spring学习笔记--初始化和销毁Bean

可以使用bean的init-method和destroy-method属性来初始化和销毁bean.定义一个Hero类: package com.moonlit.myspring; public class Hero { public void born() { System.out.println("the hero is born."); } public void defaultBorn() { System.out.println("the hero is born b

&lt;Spring实战&gt;2:装配Bean

1 声明Bean 1.1 创建 Spring 配置 Spring 容器提供两种配置 Bean 的方式:xml 配置和基于注解配置. Spring 配置文件: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/

[spring]03_装配Bean

JavaBean JavaBean 是什么 JavaBean 是一种JAVA语言写成的可重用组件. 为写成JavaBean,类必须是具体的和公共的,并且具有无参数的构造器. JavaBean 通过提供符合一致性设计模式的公共方法将内部域暴露成员属性. 例 以下是一个简单的JavaBean类. 定义一个Person类,有 name 和 age 两个属性,以及这两个属性的 get.set 方法. package com.demo.web.controllers; public class Perso

Spring中bean的作用域与bean的初始化与销毁

bean的作用域 通过在配置bean时,指定bean元素的scope来指定该bean的作用域 scope的默认值是singleton,即单例模式,在一个ApplicationContext中,每次调用getBean()方法,获取的都是同一个bean. 如果要使每次获取的bean 都不相同可以指定scope的值为prototype,那么每次调用getBean()都会获得一个新的bean Scope还可以去request指在一次Http请求中为单例 session在整个session范围中是单例的

Spring实战笔记2---Bean的装配

创建应用对象之间协作关系的行为通常成为装配,该篇的主要内容有两个,一个Spring装配Bean的几种方式以及Spring表达式,其实这两者是分不开的,在Spring中,对象无需自己负责查找或者创建与其关联的其他对象,相反容器负责把需要相互协作的对象一引用赋予各个对象,目前我们先说声明式的装配,注解式的装配等溜到下篇再详细记录,在声明用的xml配置文件中,可以使用表达式来完成一些简单的逻辑处理,和方法调用或者对象引用,在有些特殊的需求当中非它莫属,首先是装配Bean 声明Bean <bean id

spring bean的初始化和销毁

spring bean的初始化和销毁有3种形式: 1.通过注解@PostConstruct 和 @PreDestroy 方法实现初始化和销毁bean之前的操作. 2.通过xml配置init-method="" 和destory-method="" 3.通过实现InitializingBean和 DisposableBean接口