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可见的。
相关推荐
在Spring框架中,Bean的作用域(scope)是一项非常重要的特性,它决定了Bean实例的生命周期和管理方式。正确理解和运用Bean的作用域对于优化应用程序性能、简化开发流程具有重要意义。本文将详细介绍Spring中不同...
在整个生命周期中,Spring提供了多种方式来实现Bean的初始化,例如使用init-method参数、InitializingBean接口等。 二、Bean的作用域 Bean的作用域是指Bean的生命周期和可用性。Spring框架提供了多种作用域,例如 ...
- **XML配置**:在传统的Spring应用中,Bean的定义通常写在XML配置文件中,如`springbean-xml`中的配置。 - **注解配置**:使用`@Component`,`@Service`,`@Repository`和`@Controller`注解标记类,配合`@...
当需要在线程中获取Spring注解的bean时,有几种常见的方法: 1. **ThreadLocal**:Spring提供了一种名为`ThreadLocalTargetSource`的特殊`TargetSource`实现,可以将bean实例绑定到当前线程。这样,每个线程都有其...
特殊Bean用法主要涉及Spring提供的多种高级特性,包括但不限于工厂方法、 prototype scope、AOP代理、SpEL表达式、条件注解等。下面将详细介绍这些特殊用法。 1. **工厂方法**: 在某些情况下,我们可能需要自定义...
Prototype 作用域是指每一次请求(将其注入到另一个 bean 中,或者以程序的方式调用容器的 getBean()方法)都会产生一个新的 bean 实例,相当于一个 new 的操作。对于 prototype 作用域的 bean,有一点非常重要,那...
在Bean的定义中,我们可以使用`@Component`、`@Service`、`@Repository`和`@Controller`等组件注解,它们是Spring的 stereotype annotations(标准注解)。这些注解简化了Bean的声明,使得Spring可以通过扫描包路径...
如果Bean定义中有`factory-method`属性,那么Spring会调用指定的方法来实例化Bean,而不是使用默认的构造器。 2. **属性注入**:实例化后,Spring会根据Bean定义中的`property`或`ref`属性为Bean注入依赖。这包括了...
- 初始化:Spring容器在创建Bean实例时,会执行初始化过程,包括实例化、属性设置(通过setter方法或构造函数注入)、初始化回调(如`InitializingBean`接口的`afterPropertiesSet()`方法或`@PostConstruct`注解的...
在Spring框架中,Bean的范围(Scope)是控制对象实例化和管理的重要概念。它定义了Bean在应用程序中创建和共享的方式。这篇博客主要探讨了如何通过XML配置和注解的方式来设定Spring Bean的范围。 首先,让我们理解...
在Spring框架中,自动扫描和管理Bean是一种便捷的方式,它允许开发者无需显式地在配置文件中声明每个Bean,而是让Spring容器自动发现并管理应用中的组件。这一特性极大地简化了Spring应用的配置,提高了开发效率。...
在本篇文章中,我们将深入探讨Spring的核心容器及其bean的概念,以帮助你更好地理解和使用这个强大的工具。 **Spring核心容器** Spring的核心容器是整个框架的基础,它负责创建、配置和管理bean。主要有两个关键...
Spring 注解 @Scope 是 Spring IoC 容器中的一个作用域,用于定义 Bean 的生命周期和作用域。在 Spring 中,@Scope 注解可以用来定义 Bean 的实例化方式和生命周期。下面我们将详细介绍 @Scope 注解的原理和用法。 ...
除了基本的`@Component`家族,Spring还提供了一些高级注解,如`@Scope`用于定义Bean的作用域,`@Lazy`用于延迟初始化Bean,`@Qualifier`用于在多个相同类型的Bean中指定特定的一个。 ### **总结** Spring的自动...
在Spring框架中,`Scope`是一个关键的概念,用于定义Bean的作用域。在给定的文档中,主要讨论了两种特定的Bean作用域:`Request`和`Session`。这两个作用域在Web应用开发中尤其重要,因为它们与HTTP请求和会话紧密...
在Spring框架中,Bean的装配是核心功能之一,它允许我们管理对象的生命周期和依赖关系。本篇将探讨“注解的方式”来实现Spring Bean的装配。注解提供了声明式的方式来配置Bean,使得代码更加简洁,减少了XML配置的...
Spring框架是Java应用开发中的一个核心组件,尤其在企业级应用中广泛使用。Spring通过其IoC(Inversion of Control,控制反转)容器管理Bean的生命周期,提供了多种方式来定制Bean的行为。本篇文章将深入探讨Spring ...
在 Spring 中,可以使用各种方法来管理 Bean 的生命周期,例如使用 `@PostConstruct` 和 `@PreDestroy` 注解来定义 Bean 的生命周期方法。 作用域和生命周期的结合 在 Spring 中,Bean 的作用域和生命周期是紧密...
4. **使用`Prototype`作用域**:Spring中的`Prototype`作用域允许每次请求时创建一个新的Bean实例,因此可以视为一种动态加载的方式。例如: ```xml <bean id="prototypeService" class=...
在Spring框架中,`scope`是一个非常重要的概念,它决定了Spring管理的Bean的生命周期和实例化策略。默认情况下,Spring中的Bean默认为`singleton`作用域,意味着在整个应用程序中只有一个实例。然而,根据应用场景的...