• 高级装配—bean的作用域


    高级装配—bean的作用域

    Spring定义了多种作用域,可以基于这些作用域创建bean,包括:

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

    单例是默认的作用域,但是正如之前所描述,对于易变的类型,这并不合适.如果选择其他作用域,要使用@Scope注解,他可以和@Component或@Bean一起使用.

    @Component
    @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
    public class NotPad {
    }
    @Component
    @Scope("prototype")
    public class NotPad {
    }

    当然你也可以用XML来配置bean:

    <bean id="notPad" class="com.home.demo2.NotPad" scope="prototype"/>

    使用会话和请求作用域

    ​ 在web的应用中经常会用到会话和请求的作用域,这里就拿购物车这个例子来说吧,每个客户都会向购物车添加商品,这时我们希望当前用户能一直使用对应的bean,这时就需要涉及到会话作用域了,如下进行配置:

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

    WebApplicationContext.SCOPE_SESSION 这里是指的Spring会为Web应用中的每个会话创建一个ShoppingCart.这里创建多个ShoppingCart的bean的实例,但是对于给定的会话只会创建一个实例,在在当前会话相关的操作中,这个bean实际上相当于单例的.

    proxyMode会让每次会话注入到ShoppingCart的bean的代理,从而让所使用的ShoppingCart的实例恰好是当前会话所对应的那一个.

    ScopedProxyMode.INTERFACES说明这个代理要实现ShoppingCart接口,从而将调用委托个实现bean.

    当然bean原本是具体的类,我们可以设置为proxyMode = ScopedProxyMode.TARGET_CLASS,以此来表明要以生成目标类拓展的方式创建代理.

    注意:尽管我们主要关注了会话作用域,但是请求作用域的bean会面临相同的问题,因此,请求作用域的bean应该也以作用域代理的方式进行注入.

    在XML中声明作用域的代理

    我们也可以通过XML的方式来声明作用域,如下:

    <bean id="cart" class="com.home.demo2.Cart" scope="session">
                <aop:scoped-proxy/>
          </bean>

    当然,我们还可以通过roxy-target-class="false"声明基于接口的代理:

    <bean id="shoppingCart" class="com.home.demo2.ShoppingCart" scope="session" abstract="true">
          <aop:scoped-proxy proxy-target-class="false"/>
    </bean>
  • 相关阅读:
    分享10个超棒的jQuery/javascript表单插件
    分享一个超棒的在线jQuery mobile原型设计开发工具 codiqa
    分享5个超酷flash样式的jQuery导航和菜单
    jQuery类库新手使用指南之AJAX方法 第二部分
    分享5个最佳的Javascript日期处理类库
    分享一个快速开发动态互动HTML5可视化图形效果的Javascript类库 Envision.js
    了解CSS3的文字阴影效果 Text Shadow effects
    使用jQuery和CSS3创建一个支持翻转效果的微/轻博客网站列表
    分享30个带给你灵感的书法作品
    超酷HTML5和CSS3实现的登录及其注册功能表单
  • 原文地址:https://www.cnblogs.com/socketqiang/p/11325131.html
Copyright © 2020-2023  润新知