zoukankan      html  css  js  c++  java
  • spring-bean的作用域

    1、spring定义了多种作用域,可以基于这些作用域创建bean:

    • 单例(Singleton):在整个应用中,只创建一次bean实例
    • 原型(Prototype):每次注入或者通过上下文获取bean时候,都会创建一个新的bean实例
    • 会话(Session):在Web应用中,为每个会话创建一个bean实例
    • 请求(Request):在Web应用中,为每个请求创建一个bean实例

    2、配置bean作用域

    • 基于注解
    @Component
    @Scope("prototype")
    public class Person1 {
    
       //...
    }
    • 基于XML
    <bean id="person1" class="com.cn.pojo.Person1" scope="prototype"></bean>

    3、单例作用域

      在默认情况下,spring容器中的所有bean都是单例的。单例的bean如果需要保持一些状态,那么重用是不安全,因为对象会被污染。

    4、原型作用域

    5、会话作用域

      在典型的电子商务系统中,可能会有一个bean代表用户的购物车,如果购物车是单例的话,那么将会导致所有的用户都向同一个购物车中添加商品;如果购物车是原型的话,那么在应用的某个地方向购物车添加了商品,在应用给的另外一个地方可能就不可用了,因为注入的是原型作用域的购物车。此时,会话作用域最合适。

    @Component
    @Scope(value = "session",//作用域为会话,spring会为应用中的每个会话创建一个cart
    proxyMode = ScopedProxyMode.INTERFACES)//指定了代理模式 public class Cart { //... }
    proxyMode 的值由枚举类指定了可选范围:
    public enum ScopedProxyMode {
        DEFAULT,
        NO,
        INTERFACES,   //代理接口
        TARGET_CLASS;  //基于CGLisb生成基于类的代理
    
        private ScopedProxyMode() {
        }
    }

     Cart应用到下面类中

    @Component
    public class StoreService {
        
        @Autowired
        private Cart cart;
        
        //...
    }

    在web应用中StoreService 是单例的,Cart是会话的,StoreService 中注入了Cart。

    实际上由于proxyMode的作用,并不是直接注入了Cart bean,而是会注入一个到Cart bean的代理。这个代理会暴露Cart相同的方法,所以StoreService 会认为它是一个购物车。当StoreService 调用Cart的方法时,代理会对其进行蓝解析并将调用委托给会话作用域内真正的Cart bean

    6、请求作用域

      与会话作用域一样通过作用域代理的方式使用

  • 相关阅读:
    poj 3254 Corn Fields 状压dp
    poj 1330 Nearest Common Ancestors LCA/DFS
    poj1182 食物链 带权并查集 偏移量
    ural 1019. Line Painting 线段树 离散化
    zoj 2301 || hdu 1199 Color the Ball 线段树 离散化
    poj 1195 Mobile phones 二维树状数组
    poj 2155 Matrix 二维树状数组
    poj3067 Japan 树状数组 逆序数
    OpenWRT Init (User space boot) reference for Chaos Calmer: procd
    怎样写一个基于procd的init脚本
  • 原文地址:https://www.cnblogs.com/shixiemayi/p/9545566.html
Copyright © 2011-2022 走看看