欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

spring-bean的作用域

程序员文章站 2022-11-17 08:38:06
1、spring定义了多种作用域,可以基于这些作用域创建bean: 单例(Singleton):在整个应用中,只创建一次bean实例 原型(Prototype):每次注入或者通过上下文获取bean时候,都会创建一个新的bean实例 会话(Session):在Web应用中,为每个会话创建一个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、请求作用域

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