zoukankan      html  css  js  c++  java
  • Spring Bean Scopes

    在 Spring 中,Bean 的作用域决定了从 Spring 容器中返回的 Bean 实例的类型。在 Spring 中,支持以下 5 种类型的作用域:

    1、singleton — 单例模式,由 IOC 容器返回一个唯一的 bean 实例。
    2、prototype — 原型模式,被请求时,每次返回一个新的 bean 实例。
    3、request — 每个 HTTP Request 请求返回一个唯一的 Bean 实例。
    4、session — 每个 HTTP Session 返回一个唯一的 Bean 实例。
    5、globalSession — Http Session 全局 Bean 实例。

    注:大多数情况下,你可能只需要处理 Spring 的核心作用域 — 单例模式(singleton)和原型模式(prototype),默认情况下,作用域是单例模式。

    singleton 和 prototype 区别

    继续使用原来的项目,在 src/main/java 路径下,新建包:com.shiyanlou.spring.customer.services,新建类 CustomerService.java 如下:

    package com.shiyanlou.spring.customer.services;
    
    public class CustomerService
    {
        String message;
    
        public String getMessage() {
            return message;
        }
    
        public void setMessage(String message) {
            this.message = message;
        }
    }
    

    1). 如果是 singleton 情况下的 SpringBeans.xml 配置如下:

    <bean id = "CustomerService"  class = "com.shiyanlou.spring.customer.services.CustomerService" />
    

    以上配置中,如果没有指定 scope 范围,默认情况下是 singleton 模式。

    2). Prototype 情况下的配置如下:

    <bean id = "CustomerService" class = "com.shiyanlou.spring.customer.services.CustomerService" scope = "prototype"/>
    

    然后,在路径 com.shiyanlou.spring.customer.services 下创建 App.java,内容如下:

    package com.shiyanlou.spring.customer.services;
    
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    public class App
    {
         private static ApplicationContext context;
    
            public static void main( String[] args )
            {
                context = new ClassPathXmlApplicationContext(new String[] {"SpringBeans.xml"});
    
                CustomerService CSA = (CustomerService) context.getBean("CustomerService");
                CSA.setMessage("Message by CSA");
                System.out.println("Message : "+ CSA.getMessage());
    
                //retrieve it again
                CustomerService CSB = (CustomerService) context.getBean("CustomerService");
                System.out.println("Message : "+ CSB.getMessage());
            }
    }
    

    运行:

    mvn compile
    mvn exec:java -Dexec.mainClass="com.shiyanlou.spring.customer.services.App"
    

    1). singleton 情况:

    2). Prototype 情况:

    由此可知,设置 scope 为 prototype 后,测试代码中,每调用一次 getBean() 方法后,都会得到一个新的实例。

  • 相关阅读:
    混沌的艺术--- YChaos通过数学公式生成混沌图像
    相声段子:How Are You
    太阳崇拜---64幅由算法生成的八芒星图像
    自然的密码---36幅由算法生成的六芒星图像
    雪花六出---几幅算法生成的雪花图像,并祝大家平安夜和圣诞节快乐
    18个分形图形的GIF动画演示
    python的with用法(参考)
    彻底解决django 2.2以上版本与mysql兼容性问题(不用改源码)
    python操作MySQL数据库的三个模块
    MySql 外键约束 之CASCADE、SET NULL、RESTRICT、NO ACTION分析和作用
  • 原文地址:https://www.cnblogs.com/sakura579/p/13920853.html
Copyright © 2011-2022 走看看