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

    spring默认情况下:spring应用上下文的所有bean都是以单例形式创建的,也就是说一个bean在应用中只创建一次,不管是将真个bean注入到多少个其他bean中,注入的都是同一个bean。

    存在的问题:单例的bean在某些情况下存在弊端。例如,在商城系统中每一个用户需要有一个购物车,比如叫cart。但如果cart是单例的,也就是说整个商城中所有的用户共用一辆购物车,这明显是不合理的。正确的做法是为每一个用户配一辆cart,也就是在Web应用中,为每一个会话创建一个cart。

    那么spring是怎么实现的呢?

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

    • 单例(singleton):整个spring应用上下文,只创建一个bean实例
    • 原型(propotype):每次注入或者通过spring应用上下文获取,创建一个bean
    • 会话(session):web应用中,为每一个会话创建一个bean实例
    • 请求(request):web应用中,为每一个请求创建一个bean实例

    创建一个会话域的bean

    主要利用@Scope注解

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

    将cart定义成一个session作用域的bean,这样在每一次会话中汇创建一个cart,做到一人一cart。

    但用户希望使用一个cart时,spring不会将实际的cart bean注入给用户,他会把bean注入到一个cart的bean代理中。代理会将调用委托给会话作用域内真正的cart bean。

    创建一个原型域的bean

    两种方式,基于java代码和xml文件

    @Component
    @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
    public class Notepad {
      // the details of this class are inconsequential to this example
    }
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    
      <bean class="com.myapp.Notepad"
            scope="prototype" />
    
    </beans>
  • 相关阅读:
    网站添加微信支付功能(小白填坑)
    spring项目中如何添加定时器以及在定时器中自动生成sprng注入对象
    当时间一天天流逝,一个三十岁的屌丝程序员留下了了什么?
    解决使用canvas生成含有微信头像的邀请海报没有微信头像
    jQuery v1.10.2如何判断checkbox(复选框)是否被选中
    调用钉钉接口发送消息
    .net core ajax使用EPPlus上传excle导入总结
    Java企业级权限管理系统的开发总结
    RESTful学习小结
    JS实战(京东秒杀)
  • 原文地址:https://www.cnblogs.com/shuiyj/p/13185250.html
Copyright © 2011-2022 走看看