如何使用spring的作用域:
<bean id="role" class="spring.chapter2.maryGame.Role" scope="singleton"/>
|
这里的scope就是用来配置spring bean的作用域,它标识bean的作用域。
在spring2.0之前bean只有2种作用域即:singleton(单例)、non-singleton(也称prototype),Spring2.0以后,增加了session、request、global session三种专用于Web应用程序上下文的Bean。因此,默认情况下Spring2.0现在有五种类型的Bean。当然,Spring2.0对Bean的类型的设计进行了重构,并设计出灵活的Bean类型支持,理论上可以有无数多种类型的Bean,用户可以根据自己的需要,增加新的Bean类型,满足实际应用需求。
1、singleton作用域
当一个bean的作用域设置为singleton,那么Spring IOC容器中只会存在一个共享的bean实例,并且所有对bean的请求,只要id与该bean定义相匹配,则只会返回bean的同一实例。换言之,当把一个bean定义设置为singleton作用域时,Spring IOC容器只会创建该bean定义的唯一实例。这个单一实例会被存储到单例缓存(singleton cache)中,并且所有针对该bean的后续请求和引用都将返回被缓存的对象实例,这里要注意的是singleton作用域和GOF设计模式中的单例是完全不同的,单例设计模式表示一个ClassLoader中只有一个class存在,而这里的singleton则表示一个容器对应一个bean,也就是说当一个bean被标识为singleton时候,spring的IOC容器中只会存在一个该bean。
配置实例:
<bean id="role" class="spring.chapter2.maryGame.Role" scope="singleton"/>
|
或者
<bean id="role" class="spring.chapter2.maryGame.Role" singleton="true"/>
|
2、prototype
prototype作用域部署的bean,每一次请求(将其注入到另一个bean中,或者以程序的方式调用容器的getBean()方法)都会产生一个新的bean实例,相当于一个new的操作,对于prototype作用域的bean,有一点非常重要,那就是Spring不能对一个prototype bean的整个生命周期负责,容器在初始化、配置、装饰或者是装配完一个prototype实例后,将它交给客户端,随后就对该prototype实例不闻不问了。不管何种作用域,容器都会调用所有对象的初始化生命周期回调方法,而对prototype而言,任何配置好的析构生命周期回调方法都将不会被调用。清除prototype作用域的对象并释放任何prototype bean所持有的昂贵资源,都是客户端代码的职责。(让Spring容器释放被singleton作用域bean占用资源的一种可行方式是,通过使用bean的后置处理器,该处理器持有要被清除的bean的引用。)
配置实例:
<bean id="role" class="spring.chapter2.maryGame.Role" scope="prototype"/>
|
或者
<beanid="role" class="spring.chapter2.maryGame.Role" singleton="false"/>
|
3、request
request表示该针对每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP request内有效,配置实例:
request、session、global session使用的时候,首先要在初始化web的web.xml中做如下配置:
如果你使用的是Servlet 2.4及以上的web容器,那么你仅需要在web应用的XML声明文件web.xml中增加下述ContextListener即可:
<web-app>
...
<listener>
<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>
...
</web-app>
|
如果是Servlet2.4以前的web容器,那么你要使用一个javax.servlet.Filter的实现:
<web-app>
..
<filter>
<filter-name>requestContextFilter</filter-name>
<filter-class>org.springframework.web.filter.RequestContextFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>requestContextFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
...
</web-app>
|
接着既可以配置bean的作用域了:
<bean id="role" class="spring.chapter2.maryGame.Role" scope="request"/>
|
4、session
session作用域表示该针对每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP session内有效,配置实例:
配置实例:
和request配置实例的前提一样,配置好web启动文件就可以如下配置:
<bean id="role" class="spring.chapter2.maryGame.Role" scope="session"/>
|
5、global session
global session作用域类似于标准的HTTP Session作用域,不过它仅仅在基于portlet的web应用中才有意义。Portlet规范定义了全局Session的概念,它被所有构成某个portlet web应用的各种不同的portlet所共享。在global session作用域中定义的bean被限定于全局portlet Session的生命周期范围内。如果你在web中使用global session作用域来标识bean,那么,web会自动当成session类型来使用。
配置实例:
和request配置实例的前提一样,配置好web启动文件就可以如下配置:
<bean id="role" class="spring.chapter2.maryGame.Role" scope="global session"/>
|
6、自定义bean装配作用域
在spring 2.0中作用域是可以任意扩展的,你可以自定义作用域,甚至你也可以重新定义已有的作用域(但是你不能覆盖singleton和prototype),spring的作用域由接口org.springframework.beans.factory.config.Scope来定义,自定义自己的作用域只要实现该接口即可,下面给个实例:
我们建立一个线程的scope,该scope在表示一个线程中有效,代码如下:
publicclass MyScope implements Scope ...{
privatefinal ThreadLocal threadScope = new ThreadLocal() ...{
protected Object initialValue() ...{
returnnew HashMap();
}
};
public Object get(String name, ObjectFactory objectFactory) ...{
Map scope = (Map) threadScope.get();
Object object = scope.get(name);
if(object==null) ...{
object = objectFactory.getObject();
scope.put(name, object);
}
return object;
}
public Object remove(String name) ...{
Map scope = (Map) threadScope.get();
return scope.remove(name);
}
publicvoid registerDestructionCallback(String name, Runnable callback) ...{
}
public String getConversationId() ...{
// TODO Auto-generated method stub
returnnull;
}
}
|
分享到:
相关推荐
- **开发SpringBean**:根据业务需求编写具体的SpringBean实现,包括定义Bean的类型、作用域等。 #### HelloWorld案例开发 在学习SpringBean的开发过程中,最经典的莫过于HelloWorld案例了。该案例主要用于演示...
### Spring笔试题知识点详解 #### 一、依赖注入与控制反转 **知识点1:依赖注入的概念** - **定义**: 依赖注入(Dependency Injection, DI)是一种设计模式,它提倡通过构造函数、setter方法或者接口来注入一个类...
下面将对部分关键知识点进行详细解析。 ### 关于学习Spring的正确姿势 1. **明确目的**:在开始学习或调试之前,首先要确定自己的目标。是想要了解某个功能的工作原理,还是想要解决具体问题?只有明确了目标,...
- **Bean作用域**:Spring支持不同的Bean作用域,如singleton、prototype等。 - **自定义Bean**:如何创建和配置自定义Bean的方法。 - **Bean的继承**:Bean可以继承另一个Bean的配置。 - **容器扩展点**:提供...
5. **Spring Beans**:讨论Bean的定义、配置、生命周期管理和作用域。 6. **数据访问集成**:介绍Spring如何支持JDBC、ORM框架(如Hibernate、MyBatis)以及JPA。 7. **MVC框架**:详解Spring MVC的架构,控制器、...
### Spring框架知识点详解 #### 一、Spring框架基础回顾与扩展 ##### 1. Spring框架基本概念 **Spring**是一个开源框架,最初由Rod Johnson创建,目的是为了简化企业级Java应用开发。Spring提供了完整的轻量级...
下面将详细介绍Spring技术的基本用法、核心机制、依赖注入、Spring容器和被管理的Bean等知识点。 一、Spring的基本用法 Spring容器是Spring的核心,该容器负责管理Spring中的Java组件。 Spring容器有多种实现类,...
### Spring 最全约束配置文件知识点解析 #### 一、Spring框架简介 Spring是一个开源的Java应用框架,由Rod Johnson创建并领导开发。该框架的主要目标是简化企业级应用程序的开发,提供了一种轻量级的方式来处理...
Spring允许用户通过实现特定接口来自定义容器的行为,例如定义自定义Bean后处理器、自定义作用域等。 以上是Spring 2.0.6版本的一些关键知识点总结,这些知识点覆盖了Spring框架的核心概念和技术细节,对于理解和...
### Spring核心知识点详解 #### 一、Spring框架功能整体介绍 Spring框架是一个开源的企业级Java应用框架,由Rod Johnson创建并由Pivotal Software维护。它提供了一个全面的基础架构支持,使得开发人员能够轻松地...
- **新的Bean作用域**:新增加了多个Bean作用域(如`request`、`session`等),为不同的应用场景提供了更精细的控制。 - **可扩展的XML编写方式**:用户可以通过自定义命名空间和解析器来扩展Spring的XML配置语言...
- **`@Singleton`**:默认的bean作用域,表示在Spring IoC容器中,该bean的定义只有一个实例。 - **`@Prototype`**:每次从容器中请求该bean时都会创建一个新的实例。 ##### 3. Bean的选择 - **`@Primary`注解**:...
以上只是`applicationContext.xml`配置文件中一部分常见的知识点,实际应用中还有更多高级特性和用法,例如:工厂方法、属性文件外部化、bean的懒加载等。通过深入理解和熟练运用这些配置,开发者可以更好地利用...
- **3.4 Bean的作用域**:Bean可以有多种作用域,如单例(Singleton)、原型(Prototype)、请求(Request)、会话(Session)等,理解不同作用域对对象生命周期的影响至关重要。 ### 3. **AOP(Aspect-Oriented ...
### Spring手册Reference知识点详解 #### 一、Spring框架概述与应用场景 - **1.1 概述** - Spring框架自2004年发布以来,一直是Java开发领域中的核心框架之一。它提供了全面的解决方案,包括依赖注入、面向切面...
### Spring基础面试知识点详解 #### 1. Spring IoC 上下文是哪个接口? - **知识点**: `ApplicationContext` 是 Spring 框架中用于管理 Bean 的核心接口之一,它提供了比 `BeanFactory` 更丰富的功能。 - **解释**...