Spring实战(七)Bean 的作用域

  1、Spring中bean 的多种作用域

  • 单例(Singleton):整个应用中只创建一个bean 的实例,Spring默认创建单例的bean;
  • 原型(Prototype):每次注入or通过Spring应用上下文获取时,创建一个新的bean实例;
  • 会话(Session):在web应用中,为每个会话创建一个bean实例,例如用户购物车的bean;
  • 请求(Request):在web应用中,为每个请求创建一个bean实例;

  

  2、设置会话(Session)作用域

@Component
@Scope{ value=WebApplicationContext.SCOPE_SESSION,
               proxyMode=ScopedProxyMode.INTERFACES }
public ShoppingCart cart(){...}                

  3、购物车场景中的作用域代理——延迟注入请求和会话作用域的bean。

  假设将ShoppingCart  bean注入到单例StoreService  bean的Setter方法中:

@Component
public class StoreService{
    public void setShoppingCart(ShoppingCart shoppingCart){
        this.shoppingCart=shoppingCart;
    }
  ...
}

  系统中每个用户拥有一个ShoppingCart实例,我们并不想让Spring注入某个固定的ShoppingCart实例到StoreService中,我们希望的是当StoreService处理购物车功能时,它使用的ShoppingCart恰好是当前会话对应的哪一个。

  Spring会注入一个到ShoppingCart bean的代理,而不是一个实际的ShoppingCart  bean。这个代理会暴露与ShoppingCart相同的方法,所以StoreService会认为它就是一个购物车。

  而当实际调用ShoppingCart中的方法时,代理会进行懒解析并将调用委托给会话作用域内的真正的ShoppingCart  bean!!

  同样,请求作用域的bean也会面临相同的装配问题,也可以通过注入作用域代理解决。

  4、作用域代理——延迟注入请求和会话作用域的bean

  上面我们使用接口来作为作用域代理,其实也可以使用具体类。

  此时,Spring必须使用CGLib来生成基于类的代理:

 proxyMode=ScopedProxyMode.TARGET_CLASS

  5、XML中声明作用域代理

<bean id="cart" class="xx.xxx.ShoppingCart" scope="session">
    <aop:scoped-proxy />
</bean>

  <aop:scoped-proxy>即告诉Spring使为bean创建一个作用域代理,切默认使用CGLib创建目标类的代理。

  我们也可以通过设置来生成基于接口的代理:

<bean id="cart" class="xx.xxx.ShoppingCart" scope="session">
    <aop:scoped-proxy proxy-target-class="false" />
</bean>

  

原文地址:https://www.cnblogs.com/bigbigbigo/p/8368818.html

时间: 2024-10-13 09:59:22

Spring实战(七)Bean 的作用域的相关文章

spring实战装配bean之Bean的作用域以及初始化和销毁Bean

1.Bean的作用域 所有的spring bean默认都是单例.当容器分配一个Bean时,不论是通过装配还是调用容器的getBean()方法,它总是返回Bean的同一个实例.有时候需要每次请求时都获得唯一的Bean实例,那么就需要覆盖Spring默认的单例配置.当在Spring中配置<bean>元素时,可以为bean声明一个作用域.为了让spring在每次请求时都为bean产生一个新的实例,只需要配置bean的scope属性为prototype即可.如下所示: <bean id=&quo

spring实战之Bean的自动装配(非注解方式)

Bean的自动装配 自动装配(autowiring)有助于减少甚至消除配置<property>元素和<constructor-arg>元素,让Spring自动识别如何装配Bean的依赖关系. 1.1 自动装配Bean属性: Spring提供了四种各具特色的自动装配策略: 1.byName-把与Bean的属性具有相同名字的其他Bean自动装配到Bean的对应属性中.如果没有跟属性的名字相匹配的Bean,则该属性不进行装配. 2.byType-把与Bean的属性具有相同类型的其他Bea

Spring容器中bean的作用域

singleton:单体模式,在整个Spring IoC容器中只有一个实例. prototype:原型模式,每次通过容器的getBean获取的bean都会产生一个新的实例. request:对于每次HTTP的请求,使用request定义的bean都会产生一个新的实例. session:对于每次HTTP Session的,使用Session定义的bean都会产生一个新的实例. global:对于全局的HTTP Session对应一个bean.

配置spring管理的bean的作用域

.singleton 在每一个spring Ioc容器中一个bean定义只有一个对象实例.默认情况下会在容器启动时初始化bean,但我们可以指定bean节点的lazy-init = "true"来延迟初始化bean,这时候,只有第一次获取bean才会初始化bean.如下: 1 <bean id = "xxx" class = "cn.itcast.OrderServiceBean" lazy-init = "ture"/

Spring管理的Bean的生命周期

bean的初始化时机 前面讲解了Spring容器管理的bean的作用域.接着我们就要思考一个问题:bean到底是在什么时候才进行实例化的呢?我们以这个问题为引子来展开本文的说明. bean对象无外乎是在以下两个时刻进行实例化的: 调用getBean()方法时. Spring容器启动时. 那么bean对象到底是在哪个时刻进行实例化的,这与Bean的作用域有着某种联系.我们以配置Spring管理的bean的作用域的案例为基础进行深入探讨.为了能够清楚地看到bean对象的实例化,我们需要修改Perso

Spring实战-bean作用域

Spring定义了多种域 单例(Singleton):在整个应用中,只有一个实例 原型(Prototype):每次注入或者通过Spring应用上线文获取时,都创建一个bean实例 会话(Session):在web应用中,为每个会话创建一个bean.使用场景:购物车 请求(Request):在web应用中,为每个请求创建一个bean 指定作用域 在组件扫描和自动装配中 @Component @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) 在xml配置

【spring教程之四】spring中bean的作用域

1. <bean id="stage" class="com.test.pro.Stage"> 在spring中,bean默认都是单例的,也就是说,spring容易只会实例化一次,在以后的每次调用中,都会使用同一个实例.下面的例子可以说明: 2.测试类 package com.test.pro; import org.springframework.context.ApplicationContext; import org.springframewor

Spring初学之bean之间的关系和bean的作用域

一.bean之间的关系 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.o

&lt;Spring实战&gt;2:装配Bean

1 声明Bean 1.1 创建 Spring 配置 Spring 容器提供两种配置 Bean 的方式:xml 配置和基于注解配置. Spring 配置文件: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/