`
somefuture
  • 浏览: 1091519 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Spring中bean的scope用法

 
阅读更多

Spring中bean的scope有六种:singleton,prototype,request,session,global session,application。此外,用户还可以自定义scope。还有一种scope是thread类型的,但是默认没有启用。

 

singleton是默认的scope。全局范围内只有一个bean被托管,所有对它的请求或者引用都是指向的这个Spring容器内的唯一实例。

换句话说,当你定义了一个singleton的bean以后,Spring 的 IoC容器会创建且仅创建一个对象的实例。这个实例会保存在singleton bean的缓存中,所有的请求和引用都返回这个缓存中的对象。

Spring的singletonbean概念不同于24种设计模式(Gang of Four, GoF)中的单例模式,单例模式在编码中定义了对于每一个 ClassLoader 都只会产生唯一实例,而Spring的singleton bean是在每一个Spring容器中产生唯一bean。

要使用xml定义bean,可以这样

<bean id="accountService" class="com.foo.DefaultAccountService"/>
或
<bean id="accountService" class="com.foo.DefaultAccountService" scope="singleton"/>

 明确指明singleton的scope有些多余,不过可以接受。

 

 

prototype的scope是另一种常用的bean,是和singleton相对的。对于每一次请求该bean,spring都会创建一个新的实例。prototype的是有状态bean,singleton是无状态bean。

使用xml创建方式如下

<bean id="accountService" class="com.foo.DefaultAccountService" scope="prototype"/>

 不同于其他scope,Spring不会管理prototype的bean。尽管所有scope的bean初始化回调都会被调用,但是对于prototype的bean,Spring不会调用其销毁回调。必要的时候,用户需要同代码来销毁其。

 

 

request和session已经global session都是web模式下才能使用的。如果使用ClassPathXmlApplicationContext初始化容器,会报错IllegalStateException。

要是有这些scope,需要做一些额外的配置(上述两种不需要)。在Spring MVC中,如果通过DispatcherServlet 或 DispatcherPortlet 过滤请求就不需要更多修改了,因为它们包含了相关的状态。

如果没有使用Spring 的MVC,比如使用了Struts,对于Servlet 2.5需要注册org.springframework.web.context.request.RequestContextListener。对于Servlet 3.0以上,可以通过WebApplicationInitializer代码配置这个监听器。在web.xml中配置方式如下:

<web-app>
    ...
    <listener>
        <listener-class>
            org.springframework.web.context.request.RequestContextListener
        </listener-class>
    </listener>
    ...
</web-app>

 如果容器不支持这种方式,可以使用过滤器RequestContextFilter:

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

 

 

application的scope和singleton的很像,不过有两点区别:application的是对于每个ServletContext产生一个实例而非每个Spring容器;另外它是ServletContext可见的。

 

 

 

 

 

 

0
6
分享到:
评论

相关推荐

    详解Spring中bean的scope以后使用

    在Spring框架中,Bean的作用域(scope)是一项非常重要的特性,它决定了Bean实例的生命周期和管理方式。正确理解和运用Bean的作用域对于优化应用程序性能、简化开发流程具有重要意义。本文将详细介绍Spring中不同...

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

    在整个生命周期中,Spring提供了多种方式来实现Bean的初始化,例如使用init-method参数、InitializingBean接口等。 二、Bean的作用域 Bean的作用域是指Bean的生命周期和可用性。Spring框架提供了多种作用域,例如 ...

    spring bean的生命周期

    - **XML配置**:在传统的Spring应用中,Bean的定义通常写在XML配置文件中,如`springbean-xml`中的配置。 - **注解配置**:使用`@Component`,`@Service`,`@Repository`和`@Controller`注解标记类,配合`@...

    线程中获取spring 注解bean

    当需要在线程中获取Spring注解的bean时,有几种常见的方法: 1. **ThreadLocal**:Spring提供了一种名为`ThreadLocalTargetSource`的特殊`TargetSource`实现,可以将bean实例绑定到当前线程。这样,每个线程都有其...

    spring 中特殊bean用法

    特殊Bean用法主要涉及Spring提供的多种高级特性,包括但不限于工厂方法、 prototype scope、AOP代理、SpEL表达式、条件注解等。下面将详细介绍这些特殊用法。 1. **工厂方法**: 在某些情况下,我们可能需要自定义...

    详解Spring中bean的作用域

    Prototype 作用域是指每一次请求(将其注入到另一个 bean 中,或者以程序的方式调用容器的 getBean()方法)都会产生一个新的 bean 实例,相当于一个 new 的操作。对于 prototype 作用域的 bean,有一点非常重要,那...

    Spring中与Bean相关的接口

    在Bean的定义中,我们可以使用`@Component`、`@Service`、`@Repository`和`@Controller`等组件注解,它们是Spring的 stereotype annotations(标准注解)。这些注解简化了Bean的声明,使得Spring可以通过扫描包路径...

    spring bean life cycle

    如果Bean定义中有`factory-method`属性,那么Spring会调用指定的方法来实例化Bean,而不是使用默认的构造器。 2. **属性注入**:实例化后,Spring会根据Bean定义中的`property`或`ref`属性为Bean注入依赖。这包括了...

    粗略实现spring创建bean

    - 初始化:Spring容器在创建Bean实例时,会执行初始化过程,包括实例化、属性设置(通过setter方法或构造函数注入)、初始化回调(如`InitializingBean`接口的`afterPropertiesSet()`方法或`@PostConstruct`注解的...

    spring中bean的范围(xml/annotation)

    在Spring框架中,Bean的范围(Scope)是控制对象实例化和管理的重要概念。它定义了Bean在应用程序中创建和共享的方式。这篇博客主要探讨了如何通过XML配置和注解的方式来设定Spring Bean的范围。 首先,让我们理解...

    spring自动扫描和管理Bean的示例

    在Spring框架中,自动扫描和管理Bean是一种便捷的方式,它允许开发者无需显式地在配置文件中声明每个Bean,而是让Spring容器自动发现并管理应用中的组件。这一特性极大地简化了Spring应用的配置,提高了开发效率。...

    Spring之核心容器bean

    在本篇文章中,我们将深入探讨Spring的核心容器及其bean的概念,以帮助你更好地理解和使用这个强大的工具。 **Spring核心容器** Spring的核心容器是整个框架的基础,它负责创建、配置和管理bean。主要有两个关键...

    Spring注解@Scope原理及用法解析

    Spring 注解 @Scope 是 Spring IoC 容器中的一个作用域,用于定义 Bean 的生命周期和作用域。在 Spring 中,@Scope 注解可以用来定义 Bean 的实例化方式和生命周期。下面我们将详细介绍 @Scope 注解的原理和用法。 ...

    Spring学习笔记(9)----让Spring自动扫描和管理Bean

    除了基本的`@Component`家族,Spring还提供了一些高级注解,如`@Scope`用于定义Bean的作用域,`@Lazy`用于延迟初始化Bean,`@Qualifier`用于在多个相同类型的Bean中指定特定的一个。 ### **总结** Spring的自动...

    Spring中Scope为Request和Session的Bean了.docx

    在Spring框架中,`Scope`是一个关键的概念,用于定义Bean的作用域。在给定的文档中,主要讨论了两种特定的Bean作用域:`Request`和`Session`。这两个作用域在Web应用开发中尤其重要,因为它们与HTTP请求和会话紧密...

    day38 16-Spring的Bean的装配:注解的方式

    在Spring框架中,Bean的装配是核心功能之一,它允许我们管理对象的生命周期和依赖关系。本篇将探讨“注解的方式”来实现Spring Bean的装配。注解提供了声明式的方式来配置Bean,使得代码更加简洁,减少了XML配置的...

    Spring Bean生命周期&BeanDefinitions1

    Spring框架是Java应用开发中的一个核心组件,尤其在企业级应用中广泛使用。Spring通过其IoC(Inversion of Control,控制反转)容器管理Bean的生命周期,提供了多种方式来定制Bean的行为。本篇文章将深入探讨Spring ...

    深入了解Spring中Bean的作用域和生命周期

    在 Spring 中,可以使用各种方法来管理 Bean 的生命周期,例如使用 `@PostConstruct` 和 `@PreDestroy` 注解来定义 Bean 的生命周期方法。 作用域和生命周期的结合 在 Spring 中,Bean 的作用域和生命周期是紧密...

    Spring動態加載Bean

    4. **使用`Prototype`作用域**:Spring中的`Prototype`作用域允许每次请求时创建一个新的Bean实例,因此可以视为一种动态加载的方式。例如: ```xml &lt;bean id="prototypeService" class=...

    如何在Spring中自定义scope的方法示例

    在Spring框架中,`scope`是一个非常重要的概念,它决定了Spring管理的Bean的生命周期和实例化策略。默认情况下,Spring中的Bean默认为`singleton`作用域,意味着在整个应用程序中只有一个实例。然而,根据应用场景的...

Global site tag (gtag.js) - Google Analytics