`

Spring作用域配置

阅读更多

如下内容是转载别人博客的,看过之后只是简单理解了每种作用域的作用,但是具体在什么情况下使用不是很清楚,请看到该贴的高手们能够详细的说明一下什么情况下用哪种作用域,感谢!!
如何使用spring的作用域:


这里的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。
配置实例:

或者



2、prototype
      prototype作用域部署的bean,每一次请求(将其注入到另一个bean中,或者以程序的方式调用容器的getBean()方法)都会产生一个新的bean实例,相当一个new的操作,对于prototype作用域的bean,有一点非常重要,那就是Spring不能对一个prototype bean的整个生命周期负责,容器在初始化、配置、装饰或者是装配完一个prototype实例后,将它交给客户端,随后就对该prototype实例不闻不问了。不管何种作用域,容器都会调用所有对象的初始化生命周期回调方法,而对prototype而言,任何配置好的析构生命周期回调方法都将不会被调用。清除prototype作用域的对象并释放任何prototype bean所持有的昂贵资源,都是客户端代码的职责。(让Spring容器释放被singleton作用域bean占用资源的一种可行方式是,通过使用bean的后置处理器,该处理器持有要被清除的bean的引用。)
配置实例:

或者

3、request
    request表示该针对每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP request内有效。
request、session、global session使用的时候首先要在web.xml中做如下配置:

     如果你使用的是Servlet 2.4及以上的web容器,那么你仅需要在web应用的XML声明文件web.xml中增加下述ContextListener即可:


   ...
  org.springframework.web.context.request.RequestContextListener
   ...

,如果是Servlet2.4以前的web容器,那么你要使用一个javax.servlet.Filter的实现:

..
requestContextFilterorg.springframework.web.filter.RequestContextFilterrequestContextFilter/*
   ...


接着既可以配置bean的作用域了:



4、session
     session作用域表示该针对每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP session内有效,配置实例:
配置实例:
和request配置实例的前提一样,配置好web启动文件就可以如下配置:



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启动文件就可以如下配置:



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;
     }
           }

 

分享到:
评论
1 楼 shuai0929 2010-08-21  
可以解决线程的安全问题。如果频繁的多个用户使用某个实例进行操作就需要多个线程,通常可以使用spring来创建struts的Action,因为struts自己创建的时候它就是一个单实例,如果把创建的方式放到Spring中的时候,就可以设置它的scope,这样action就有多个实例,同时每一个线程都有一个实例,这样线程就是安全的了

相关推荐

    spring的bean作用域

    在Spring框架中,Bean的作用域是管理Bean实例创建和存活范围的重要概念。Bean的作用域决定了在特定上下文中,Spring容器如何管理和提供Bean的实例。在Spring中,有五种主要的Bean作用域: 1. **Singleton作用域**:...

    详解Spring中bean的作用域

    对于 prototype 作用域的 bean,有一点非常重要,那就是 Spring 不能对一个 prototype bean 的整个生命周期负责,容器在初始化、配置、装饰或者是装配完一个 prototype 实例后,将它交给客户端,随后就对该 ...

    详解Spring中Bean的生命周期和作用域及实现方式

    Spring中Bean的生命周期和作用域及实现方式 Spring是一个非常流行的Java应用程序框架,它提供了一个灵活的机制来管理Bean的生命周期和作用域。Bean的生命周期和作用域是Spring框架中两个非常重要的概念,它们决定了...

    Spring实战之Bean的作用域singleton和prototype用法分析

    在Spring框架中,Bean的作用域是决定如何管理和创建Bean实例的关键概念。本篇文章将深入探讨两种主要的作用域:singleton和prototype,并通过实例分析其用法和注意事项。 首先,`singleton`是Spring默认的作用域,...

    spring-aware接口实现与bean作用域(spring多容器层面)

    在Spring框架中,`Spring-Aware`接口是一个重要的概念,它允许我们与Spring的应用上下文(ApplicationContext...通过正确地配置和使用`Spring-Aware`接口以及理解Bean的作用域,可以有效地在这些模块间共享和协同工作。

    Spring Bean的作用域.docx

    在Spring框架中,Bean的作用域(Scope)是一个关键概念,它决定了如何管理和实例化Bean。Spring提供了五种不同的Bean作用域,每种都有其特定的使用场景和行为。 1. **Singleton作用域**:这是Spring的默认作用域,...

    Spring容器中Bean的作用域编程开发技术共3页.pd

    在Spring框架中,Bean的作用域是其生命周期管理的关键部分,它决定了Bean的创建、共享以及销毁方式。本篇内容将深入探讨Spring容器中Bean的作用域编程开发技术,以帮助开发者更好地理解和利用这些特性来优化应用的...

    JSP内置对象及四种作用域

    `application.setAttribute()`方法用于设置application作用域的属性,常用于全局配置或统计信息。 了解这四种作用域对于编写高效、健壮的JSP应用至关重要。在实际开发中,开发者需要根据需求选择合适的作用域,以...

    浅谈spring中scope作用域

    spring 中的 scope 作用域 spring 中的 scope 作用域是指在spring 框架中,bean 的实例化和生命周期的管理。Scope 作用域决定了 bean 的实例化方式、生命周期和作用域。 singleton 作用域 ----------------- 在 ...

    spring配置最佳实践.zip

    Spring支持单例(Singleton)、原型(Prototype)、请求(Request)和会话(Session)等多种bean作用域。理解每种作用域的特点并正确使用是确保应用程序行为一致的关键。 七、AOP编程 Spring的面向切面编程(AOP)...

    Spring配置文件spring-context.zip

    Spring支持单例(singleton)、原型(prototype)、请求(request)、会话(session)等多种作用域。默认是单例。 5. `init-method`和`destroy-method`:指定bean初始化和销毁时要调用的方法。 6. `<import>`:...

    spring配置文件----注解配置

    6. `@Scope`: 用于定义bean的作用域,如单例(`singleton`)、原型(`prototype`)等。 7. `@Import`: 用于引入其他的配置类,方便模块化管理。 8. `@PostConstruct` 和 `@PreDestroy`: 分别标识初始化和销毁方法,会...

    Spring 最全约束配置文件

    - `<bean>`元素:用于定义单个Bean的信息,包括其类型、作用域、生命周期方法等。 - `<import>`元素:用于引入其他配置文件,便于模块化管理配置信息。 #### 四、Spring配置约束详解 - **约束条件**:Spring框架...

    spring配置详解

    Spring提供了对bean生命周期的精细控制,包括初始化回调、销毁回调、作用域等。例如,可以使用`init-method`和`destroy-method`属性定义初始化和销毁方法,`scope`属性指定bean的作用域(单例、原型等)。 六、自动...

    spring配置文件

    3. **Bean的作用域**:Spring提供了多种bean的作用域,如单例(Singleton)、原型(Prototype)、请求(Request)、会话(Session)等,根据需求选择合适的bean作用域可以优化应用性能。 4. **Bean的初始化和销毁...

    Spring实战之协调作用域不同步的Bean操作示例

    Spring实战之协调作用域不同步的Bean操作示例 .spring框架是Java领域中最流行的轻量...我们学习了lookup-method机制、Prototype作用域和Spring框架的配置文件。这些知识点对于深入理解Spring框架的实战应用非常重要。

    Spring框架xml注解配置方式实例

    6. **其他注解**:如`@Transactional`用于声明事务管理,`@Scope`用于设置bean的作用域,`@Resource`用于JSR-250规范的注入等。 7. **XML配置中的bean定义**:尽管大部分配置可以通过注解完成,但在某些情况下,...

    spring开发指南.pdf + Spring快速入门教程.pdf + spring配置.pdf

    XML配置是最传统的形式,涉及Bean的声明、属性注入、作用域定义等。注解配置则简化了XML,允许在类或方法上直接使用注解来定义Bean及其属性。Java配置是Spring 3.0引入的,它使用Java类来定义Bean,提供了更直观和...

Global site tag (gtag.js) - Google Analytics