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

  • 单例(Singleton):在整个应用中,只创建bean的一个实例。(默认)
  • 原型(Prototype):每次注入或者通过Spring应用上下文获取的 时候,都会创建一个新的bean实例。

    <1>如果使用组件扫描来发现和声明bean,那么可以在bean的 类上使用@Scope注解,将其声明为原型bean:

      @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE )或者@Scope("prototype")

    <2>如果想在Java配置中声明原型bean,那么可以组合使 用@Scope和@Bean来指定所需的作用域。

    <3>如果使用XML来配置bean的话,可以使用<bean>元素的 scope属性来设置作用域

  • 会话(Session):在Web应用中,为每个会话创建一个bean实例。
  • 请求(Request): 在Web应用中,为每个请求创建一个bean实例。

     购物车bean设置为会话作用域,使用@Scope注解:@Scope(value=WebApplicationContext.SCOPE_SESSION,proxyMode=ScopedProxyMode.INTERFACES)

  电子商务应用中,当用户进入系统后,创建了相应的会话后,购物车实例才会产生,而且系统中会有多个购物车的实例,每个用户一个。系统中还有一个专门处理购物车的实例StoreService(将购物车对象传入,然后进行处理),它是一个单例的bean,会在Spring应用上下文加载的时候创建。这时会产生一个问题,当创建这个StoreServices时,Spring会试图将购物车bean注入到StoreService中,但此时购物车bean是会话作用域的,此时并不存在。所以,期望是当StoreService处理购物车功能时,它所使用的购物车实例恰好时当前会话所对应的那一个。Spring并不会将实际的购物车bean注入到StoreService中, Spring会注入一个到购物车 bean的代理,。这个代理会暴露与购物车bean相同的方法,所以StoreService 会认为它就是一个购物车。但是,当StoreService调 用购物车的方法时,代理会对其进行懒解析并将调用委托 给会话作用域内真正的购物车 bean。

proxyMode属性被设置成了 ScopedProxyMode.INTERFACES,这表明这个代理要实现 购物车的接口,并将调用委托给实现bean。如果购物车类是接口而不是类的话,这是可以的(也是最为 理想的代理模式)。但如果购物车类是一个具体的类的话, Spring就没有办法创建基于接口的代理了。此时,它必须使用CGLib 来生成基于类的代理。所以,如果bean类型是具体类的话,我们必须要将proxyMode属性设置为ScopedProxyMode.TARGET_CLASS,以此来表明要以生成目标 类扩展的方式创建代理。

请求作用域的bean应该也以作用域代理的方式进行注入。

如果需要使用XML来声明会话或请求作用域的bean,那么就不能使 用@Scope注解及其proxyMode属性了,要使用<aop:scoped-proxy>。

  <aop:scoped-proxy>是与@Scope注解的proxyMode属性功能相 同的Spring XML配置元素。它会告诉Spring为bean创建一个作用域代理。默认情况下,它会使用CGLib创建目标类的代理。但是我们也可 以将proxy-target-class属性设置为false,进而要求它生成基 于接口的代理:

                   <为了使用<aop:scoped-proxy>元素,我们必须在XML配置中声明 Spring的aop命名空间>

    

笔记5 bean的作用域的更多相关文章

  1. [原创]java WEB学习笔记99:Spring学习---Spring Bean配置:自动装配,配置bean之间的关系(继承/依赖),bean的作用域(singleton,prototype,web环境作用域),使用外部属性文件

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  2. Spring4学习笔记 - 配置Bean - 自动装配 关系 作用域 引用外部属性文件

    1 Autowire自动装配 1.1 使用:只需在<bean>中使用autowire元素 <bean id="student" class="com.k ...

  3. Spring 学习笔记 Bean的作用域

    在配置文件中定义Bean时,用户不但可以配置Bean的属性值以及相互之间的依赖关系,还可以定义Bean的作用域.作用域将对Bean的生命周期和创建方式产生影响.在低版本的Spring中,仅有两个作用域 ...

  4. 吴裕雄--天生自然JAVA SPRING框架开发学习笔记:Spring中Bean的作用域

    作用域的种类 Spring 容器在初始化一个 Bean 的实例时,同时会指定该实例的作用域.Spring3 为 Bean 定义了五种作用域,具体如下. 1)singleton 单例模式,使用 sing ...

  5. 浅析Spring中bean的作用域

    一.前言   刚刚花了点时间,阅读了一下Spring官方文档中,关于bean的作用域这一块的内容.Spring-4.3.21官方文档中,共介绍了七种bean作用域,这篇博客就来简单介绍一下这七种作用域 ...

  6. Spring中Bean的作用域、生命周期

                                   Bean的作用域.生命周期 Bean的作用域 Spring 3中为Bean定义了5中作用域,分别为singleton(单例).protot ...

  7. Spring bean的作用域和生命周期

    bean的作用域 1.singleton,prototype, web环境下:request,session,gloab session 2.通过scope="" 来进行配置 3. ...

  8. Bean 的作用域

    •在 Spring 中, 可以在 <bean> 元素的 scope 属性里设置 Bean 的作用域. 默认情况下, Spring 只为每个在 IOC 容器里声明的 Bean 创建唯一一个实 ...

  9. Spring学习笔记—装配Bean

    在Spring中,对象无需自己负责查找或创建与其关联的其他对象.相反,容器负责把需要相互协作的对象引用赋予各个对象.创建应用对象之间协作关系的行为通常称为装配(wiring),这也是依赖注入的本质. ...

随机推荐

  1. js window

    window对象: browser object mode :bom对象. bom提供了独立于内容而与浏览器窗口进行交互的对象. bom主要用于管理窗口与窗口之间的通讯,因此其核心对象是window ...

  2. Python-基础学习-Day1

    1 Python介绍 1.1 Python 是一门什么样的语言? python是一门动态解释性的强类型定义语言. 编译型的特点:可一致性差,运行速度快. 解释型的特点:边执行边解释,速度慢 1.2 P ...

  3. Spring Security入门(1-12)Spring Security 的过滤器机制

    Servlet过滤器被用来拦截用户请求来进行请求之前或之后的处理,或者干脆重定向这个请求,这取决于servlet过滤器的功能. Servlet过滤器处理之后的目标servlet是 MVC 分发web ...

  4. 从零搭建 webpack3 环境 #1 - 安装使用

    目录: (1)什么是webpack (2)webpack核心概念 (3)环境安装 (4)开始使用webpack 1.什么是webpack 官网的一幅图对webpack的解释,从图中可以看出,webpa ...

  5. logback中批量插入数据库的参考代码

    protected void insertProperties(Map<String, String> mergedMap, Connection connection, long eve ...

  6. mysql批量插入语句执行失败的话,是部分失败还是全部失败

    项目开发中,正好遇到这个问题. 将一批从外部第三方接口获取到的数据存储到本地mysql数据库,假设接口返回的数据类型为A,经过A到B的转换规则转换后, 要插入数据库的数据类型为B.那么在A获取到100 ...

  7. Java课后练习

    1.利用循环输出:************************* public class Shape { public static void main(String[] args) { for ...

  8. React-Native(五):React Native之Text学习

    本章节主要学习Text的布局,仿照网易新网: 代码: /** * Sample React Native App * https://github.com/facebook/react-native ...

  9. urllib.request.Request

    import urllib.request #可以将url先构造成一个Request对象,传进urlopen #Request存在的意义是便于在请求的时候传入一些信息,而urlopen则不 reque ...

  10. ThreadLocal原理分析与使用场景

    什么是ThreadLocal变量 ThreadLoal 变量,线程局部变量,同一个 ThreadLocal 所包含的对象,在不同的 Thread 中有不同的副本.这里有几点需要注意: 因为每个 Thr ...