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()(如果这些方法存在的话,否则什么都不会发生)。
spring实战三装配bean之Bean的作用域以及初始化和销毁Bean的更多相关文章
- Spring实现初始化和销毁bean之前进行的操作,三种方式
关于在spring 容器初始化 bean 和销毁前所做的操作定义方式有三种: 第一种:通过@PostConstruct 和 @PreDestroy 方法 实现初始化和销毁bean之前进行的操作 第二 ...
- Spring源码学习之: 通过Spring @PostConstruct 和 @PreDestroy 方法 实现初始化和销毁bean之前进行的操作
关于在spring 容器初始化 bean 和销毁前所做的操作定义方式有三种: 第一种:通过@PostConstruct 和 @PreDestroy 方法 实现初始化和销毁bean之前进行的操作 第二 ...
- 通过Spring @PostConstruct 和 @PreDestroy 方法 实现初始化和销毁bean之前进
关于在spring 容器初始化 bean 和销毁前所做的操作定义方式有三种: 第一种:通过@PostConstruct 和 @PreDestroy 方法 实现初始化和销毁bean之前进行的操作 第二 ...
- 通过Spring @PostConstruct 和 @PreDestroy 方法 实现初始化和销毁bean之前进行的操作
关于在spring 容器初始化 bean 和销毁前所做的操作定义方式有三种: 第一种:通过@PostConstruct 和 @PreDestroy 方法 实现初始化和销毁bean之前进行的操作 第二 ...
- 三种不同实现初始化和销毁bean之前进行的操作的比较
Spring容器中的bean是有生命周期的,Spring 允许在 Bean 在初始化完成后以及 Bean 销毁前执行特定的操作,常用的设定方式有以下三种: 通过实现 InitializingBean/ ...
- Spring学习笔记--初始化和销毁Bean
可以使用bean的init-method和destroy-method属性来初始化和销毁bean.定义一个Hero类: package com.moonlit.myspring; public cla ...
- 在spring容器中定义初始化和销毁bean前所做的操作,有三种方式
1.使用注解,通过@PostConstruct 和 @PreDestroy 方法 实现初始化和销毁bean之前进行的操作 package com.luoq.test.annotation.init; ...
- 三种方式创建bean对象在springIOC容器中初始化、销毁阶段要调用的自定义方法
1. 使用@Bean注解定义initMethod和destroyMethod 所谓initMethod和destroyMethod,是指在springIOC容器中,对于bean对象执行到初始化阶段和销 ...
- Spring实战之装配Bean
1.1Spring配置的可选方案 Spring容器负责创建应用程序中的bean并通过DI来协调这些对象之间的关系.但是,作为开发人员,你需要告诉Spring要创建哪些bean并且如何将其装配在一起.当 ...
随机推荐
- IOS APP的所有图标尺寸规范
转自: http://blog.csdn.net/chonbj/article/details/25133247 像我一样记不住iOS应用图标像素尺寸的开发者不在少数,我经常需要查询不同设备上的应用尺 ...
- Leetcode 之Convert Sorted Array to Binary Search Tree(54)
思路很简单,用二分法,每次选中间的点作为根结点,用左.右结点递归. TreeNode* sortedArrayToBST(vector<int> &num) { return so ...
- myeclipse2014集成SVN
团队合作的项目肯定少不了版本控制,那么现在就看看myeclispe中是如何使用的吧. 开发环境:myeclipse 2014 java 8 tomcate 8 试了网上说的几种方法,都没有成功,最 ...
- WCDMA是什么意思?CDMA是什么意思?GSM是什么意思
有些朋友在购买3G智能手机的时候会遇到这样的困惑,为什么相同的手机会有不同手机网络制式之分呢?有的支持WCDMA/GSM,有的支持CDMA/GSM,到底自己应该选购哪一种手机好呢?WCDMA是什么意思 ...
- win7系统扩展双屏幕时,如何在两个屏幕下都显示任务栏
扩展屏幕下都显示任务栏!!! win7系统本身无法设置该功能(目前我是不知道) 但可以下载第三方软件来解决该问题. 第一步:Dual Monitor Taskbar 下载软件 下载链接:http:// ...
- thinkcentre m8380t黑屏 解决办法
问题: 开机后,显示器上显示“无信号输入”,一直黑屏,但是主机的风扇.硬盘声音都正常. 解决办法: 把vga线等加紧了一些,屏幕还是不亮,然后我关掉插排电源,给cmos放了电,再重启就可以了. 这时需 ...
- mac os x查看端口命令
`netstat` 命令 a. `netstat -nat | grep <端口号>` 转自: http://my.oschina.net/foreverich/blog/402252
- C++代码重用——包含
#ifndef PAIRS_H #define PAIRS_H #include <iostream> #include <valarray> template <cla ...
- windows2003批量添加和导出所有ip
批量添加IP 在cmd命令行下运行: FOR /L %i IN (130,1,190) DO netsh interface ip add address "本地连接" 192.1 ...
- 【好用的小技巧】win8兼容、网页不让复制
1.今天下了个matlab7,我用的是win8系统,不兼容. 解决:鼠标右键matlab7的快捷键,点击属性,选择兼容性,选择window vista即可运行 2.在一个 网页上看到一个对自己很有帮助 ...