`

Spring的scope属性_001

阅读更多

如何使用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装配作用域
在spring2.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;
}
}

 

分享到:
评论

相关推荐

    Spring之scope讲解测试示例代码

    在Spring框架中,`scope`是一个非常重要的概念,它决定了Bean的生命周期和实例化策略。在Spring中,Bean的scope主要有以下几种: 1. **singleton(单例)**:这是默认的scope,每个容器中只有一个实例。无论多少次...

    Spring_1200_IOC_Annotation_Component

    6. `@Scope`:定义bean的作用域,例如单例(`@Scope("singleton")`)或多例(`@Scope("prototype")`)。 **Spring容器** Spring容器是IoC的实现,它负责创建、配置和管理bean。主要有两种类型的容器:BeanFactory和...

    Spring_01_入门篇_依赖注入(控制反转)_ANN

    4. `@Autowired`:这个注解用于自动装配bean的依赖,Spring会根据类型或属性名自动找到合适的依赖注入。 5. `@Qualifier`:当有多个相同类型的bean时,使用@Qualifier指定特定的bean。 6. `@Configuration`:标记...

    Spring学习工程1

    8. **Spring_0800_IOC_AutoWire**:自动装配是Spring的特性之一,它可以根据类型或名称自动为bean的属性注入依赖,减少了手动配置的工作量。 9. **Spring_1300_IOC_Pre_Post_Scope**:这里可能讨论的是Spring的生命...

    知识共享-Spring注入属性值案例(雷惊风).

    &lt;bean id="person" class="org.viking.spring.imp.Person" scope="prototype"&gt; &lt;value&gt;30 &lt;bean class="org.viking.spring.imp.Son"&gt; &lt;value&gt;11 &lt;bean id="son2" class="org.viking.spring....

    spring基础实例源码

    4. **Spring_0600_IOC_Bean_Scope**: Spring提供了多种bean的作用域,包括单例(Singleton)、原型(Prototype)、会话(Session)和请求(Request)等。理解每种作用域的特点及其应用场景对于优化应用性能和设计...

    07-IoC配置-scope属性

    scope属性 名称: scope类型:属性 归属: bean标签 作用:定义bean的作用范围 格式: &lt;bean scope=“singleton"&gt; 取值: singleton:设定创建出的对象保存在spring容器中,是一个单例的对象(bean默认是单例) 单例...

    spring_精简教程

    - **`scope`属性**:用于指定Bean的生命周期范围,如`singleton`(单例模式)、`prototype`(原型模式)等。 - **`init-method`与`destroy-method`属性**:分别用于指定Bean的初始化方法和销毁方法。 #### 四、...

    spring_test.zip

    Spring容器会根据类型或名称自动将合适的bean注入到当前bean的属性或方法中。 3. `@Qualifier`:当有多个相同类型的bean时,`@Qualifier`可以用来指定具体要注入哪个bean。 4. `@Configuration`和`@Bean`:这两个...

    day38 08-Spring的id、name和scope顺序

    在Spring框架中,`id`、`name`和`scope`是配置bean时常见的三个属性,它们对于理解和管理Bean的生命周期至关重要。今天我们将深入探讨这三个属性的含义、使用方法以及它们之间的顺序规则。 首先,`id`是Spring Bean...

    springDataJapDemo

    &lt;scope&gt;runtime&lt;/scope&gt; ``` 这里我们选择了PostgreSQL数据库驱动作为运行时依赖。 2. **创建实体类(Entity)**: Spring Data JPA通过实体类来映射数据库表。比如,我们可以创建一个`User`实体类,使用`@...

    Spring2.5_注解介绍(3.0通用)

    Spring框架在2.5版本引入了对注解的广泛支持,这一特性在后续的3.0版本中得到了进一步增强,并且成为了Spring应用的核心部分。注解的使用极大地简化了Spring配置,提高了代码的可读性和可维护性。下面将详细介绍其中...

    spring_core_annotation:注释弹簧

    当Spring容器发现一个带有@Autowired的属性或方法时,它会尝试找到类型匹配的Bean进行注入。如果存在多个候选Bean,可以通过@Qualifier注解指定特定的Bean。 4. **@Qualifier**: 与@Autowired一起使用,用于在有多...

    spring2.5_学习笔记.

    - **@Scope**:指定 Bean 的作用域。 - **@PostConstruct**、**@PreDestroy**:用于指定初始化和销毁方法。 - **Jar 包依赖**:需要引入 Spring 的 Context 支持库以及其他相关库。 #### 第七课:AOP (面向切面...

    Spring6_pdf版讲义.pdf

    - **Spring配置文件**:XML文件中定义了bean的声明、属性等信息。 - **bean**:表示应用程序中的对象,在Spring容器中进行管理。 #### 5. 启用Log4j日志框架 - **配置文件**:在Spring配置文件中配置Log4j。 - **...

    15spring4_mybatis4.rar

    2. 使用Spring的`@Scope("prototype")`,为每个请求创建新的Mapper实例,避免线程安全问题。 3. 利用Spring的`@Profile`注解,根据环境选择不同的配置。 通过以上步骤,我们可以实现Spring 4.x与MyBatis 4的深度...

    spring_Ioc

    Spring会根据类型或者属性名找到合适的依赖进行注入。 4. `@Qualifier`:当有多个相同类型的Bean,而我们需要指定具体哪一个时,可以使用`@Qualifier`注解来明确选择。 5. `@Scope`:这个注解用于定义Bean的作用...

    spring_injection1

    - **SpEL(Spring Expression Language)**:Spring表达式语言,用于在运行时查询和操作Bean属性及集合。 压缩包中的“spring_injection1”文件可能包含了这些概念的代码示例,帮助读者更直观地理解和实践Spring的...

    Spring高级篇二.pdf

    - 需要注意的是,`destroy-method`仅对单例`scope="singleton"`的Bean有效,并且只有在手动关闭`ApplicationContext`对象时才会被调用。 - **完整的生命周期**: - Spring Bean的生命周期包括了从创建到销毁的一...

    Spring_Inner_Beans

    5. **Inner Beans与 prototype scope** - 如果一个Inner Bean声明为`prototype`作用域,那么每次parent bean需要这个Inner Bean时,Spring都会创建一个新的实例,这提供了在单例bean中使用多例bean的能力。 6. **...

Global site tag (gtag.js) - Google Analytics