Spring bean的作用域
来源:互联网 发布:网络作家如何赚钱 编辑:程序博客网 时间:2024/06/07 01:49
Spring Framework支持五种作用域(其中后三种只能用在基于web的Spring ApplicationContext)。
设置Bean的作用域是通过scope属性来指定。可以接受Singleton、prototype、request、session、global session 5个值。
下面我们来看一下如下的代码段,对于bean1没有指定scope属性,则默认使用singleton,而bean2则指定一个prototype。
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <!-- 配置一个singleton Bean实例:默认 --> <bean id="bean1" class="com.Bean1" /> <!-- 配置一个prototype Bean实例 --> <bean id="bean2" class="com.Bean2" scope="prototype"/> </beans>
下面我们来详细的说明下各个作用域。
1.Singleton
当一个bean的作用域为singleton, 那么Spring IoC容器中只会存在一个共享的bean实例,并且所有对bean的请求,只要id与该bean定义相匹配,则只会返回bean的同一实例。换言之,当把一个bean定义设置为singlton作用域时,Spring IoC容器只会创建该bean定义的唯一实例。这个单一实例会被存储到单例缓存(singleton cache)中,并且所有针对该bean的后续请求和引用都将返回被缓存的对象实例。
如果我们不指定Bean的作用域,则Spring会默认使用singleton作用域。
2.Prototype
Prototype作用域的bean会导致在每次对该bean请求(将其注入到另一个bean中,或者以程序的方式调用容器的getBean()方法)时都会创建一个新的bean实例。根据经验,对所有有状态的bean应该使用prototype作用域,而对无状态的bean则应该使用singleton作用域。
典型情况下,DAO不会被配置成prototype,因为一个典型的DAO不会持有任何会话状态,因此应该使用singleton作用域。
对于prototype作用域的bean,有一点非常重要,那就是Spring不能对一个prototype bean的整个生命周期负责:容器在初始化、配置、装饰或者是装配完一个prototype实例后,将它交给客户端,随后就对该prototype实例不闻不问了。
不管何种作用域,容器都会调用所有对象的初始化生命周期回调方法,而对prototype而言,任何配置好的析构生命周期回调方法都将不会被调用。清除prototype作用域的对象并释放任何prototype bean所持有的昂贵资源,都是客户端代码的职责。(让Spring容器释放被singleton作用域bean占用资源的一种可行方式是,通过使用bean的后置处理器,该处理器持有要被清除的bean的引用。)
而singleton作用域的Bean实例一旦创建成功,可以重复使用。因此,除非必要,否则尽量避免将Bean的作用域设置为prototype。
谈及prototype作用域的bean时,在某些方面你可以将Spring容器的角色看作是Java new操作符的替代者。任何迟于该时间点的生命周期事宜都得交由客户端来处理。
向后兼容性:在XML中指定生命周期作用域
如果你在bean定义文件中引用’spring-beans.dtd’ DTD,要显式说明bean的生命周期作用域你必须使用”singleton”属性(记住singleton生命周期作用域是默认的)。 如果引用的是’spring-beans-2.0.dtd’ DTD或者是Spring 2.0 XSD schema,那么需要使用”scope”属性(因为”singleton”属性被删除了,新的DTD和XSD文件使用”scope”属性)。
简单地说,如果你用”singleton”属性那么就必须在那个文件里引用’spring-beans.dtd’ DTD。 如果你用”scope”属性那么必须 在那个文件里引用’spring-beans-2.0.dtd’ DTD 或’spring-beans-2.0.xsd’ XSD。
3.Request
针对每次HTTP请求,Spring容器会根据loginAction bean定义创建一个全新的LoginAction bean实例,且该loginAction bean实例仅在当前HTTP request内有效,因此可以根据需要放心的更改所建实例的内部状态,而其他请求中根据loginAction bean定义创建的实例,将不会看到这些特定于某个请求的状态变化。当处理请求结束,request作用域的bean实例将被销毁。
4.Session
针对某个HTTP Session,Spring容器会根据userPreferences bean定义创建一个全新的userPreferences bean实例,且该userPreferences bean仅在当前HTTP Session内有效。与request作用域一样,你可以根据需要放心的更改所创建实例的内部状态,而别的HTTP Session中根据userPreferences创建的实例,将不会看到这些特定于某个HTTP Session的状态变化。当HTTP Session最终被废弃的时候,在该HTTP Session作用域内的bean也会被废弃掉。
5.global session
global session作用域类似于标准的HTTP Session作用域,不过它仅仅在基于portlet的web应用中才有意义。Portlet规范定义了全局Session的概念,它被所有构成某个portlet web应用的各种不同的portlet所共享。在global session作用域中定义的bean被限定于全局portlet Session的生命周期范围内。
请注意,假如你在编写一个标准的基于Servlet的web应用,并且定义了一个或多个具有global session作用域的bean,系统会使用标准的HTTP Session作用域,并且不会引起任何错误。
- spring bean的作用域
- spring bean的作用域
- Spring---->Bean的作用域
- spring bean的作用域
- spring bean的作用域
- spring bean 的作用域
- spring bean的作用域
- Spring Bean的作用域
- Spring Bean的作用域
- Spring Bean的作用域
- Spring bean的作用域
- spring bean的作用域
- spring bean的作用域
- Spring---->Bean的作用域
- Spring、Bean 的作用域
- Spring Bean 的作用域
- Spring Bean的作用域
- Spring Bean的作用域
- hbase源码分析-是否split
- 华为在线训练(10)
- Docker部署OpenStack API
- linx x86平台成功注入so 并且通道rel进行hook
- linu 用户及用户组命令操作
- Spring bean的作用域
- #11 Search Range in Binary Search Tree
- pickerView控件的简单使用
- HashMap HashTable区别
- Catch That Cow
- 炸裂的生物钟
- sublime Text 2搭建python开发环境
- Confd与Rancher-metadata结合的妙用
- iOS 远程消息推送