zoukankan      html  css  js  c++  java
  • Spring基础11——Bean的作用域

     

    1.Bean的作用域种类

            Spring中的bean的作用域分为四种:singleton、prototype、session、request,后两种很少使用,下面我们主要来学习前两种

    2.singleton单例模式

            在Spring种我们可以通过bean标签中的scope属性对Bean的作用域进行设置,singleton是默认值,容器初始时创建bean实例,在整个容器的生命周期内只创建一这一个bean,是单例的,在程序种无论获取多少次这个bean返回的都是同一个bean,并且在容器启动的时候就会创建。

    1)验证bean是否是单例的

    首先配置一个singleton作用域的bean

    1 <bean id="car" class="com.wzy.autowire.Car" scope="singleton">
    2    <property name="brand" value="AUDI"/>
    3    <property name="price" value="300000"/>
    4 </bean>

    执行java测试类:

     1 public class Main {
     2     public static void main(String[] args) {
     3         ApplicationContext ctx = new ClassPathXmlApplicationContext("beans-scope.xml");
     4 
     5         Car car = (Car) ctx.getBean("car");
     6         Car car2 = (Car) ctx.getBean("car");
     7 
     8         System.out.println(car == car2);
     9     }
    10 }

    执行结果:

    我们可以看到打印了执行了Car的构造方法,并且两个对象的引用时相等的,说明使用singleton模式多次返回的bean是同一个。

    2)验证单例模式的bean是否在IOC容器启动时就被创建

    在不改变配置文件的情况下,我们只执行下面一行代码:

    1 ApplicationContext ctx = new ClassPathXmlApplicationContext("beans-scope.xml");

    输出结果:

    根据输出结果我们可以观察到,我们没有去getBean,但是Car的构造方法还是执行,说明在IOC容器启动时,就将单例的对象创建好,当程序中需要这个bean直接将创建好的bean推送给程序。

    3.prototype原型模式(即多例模式)

    原型模式是经常使用的一种bean作用域,使用prototype作用域,容器初始化时不创建bean的实例,而在每次请求时都创建一个新的Bean实例,并返回。

    1)验证bean是否是多例的

    spring配置文件配置一个多例的bean:

    1 <bean id="car" class="com.wzy.autowire.Car" scope="prototype">
    2     <property name="brand" value="AUDI"/>
    3     <property name="price" value="300000"/>
    4 </bean>

    我们同样来执行之前那段Java的测试代码:

    public class Main {
        public static void main(String[] args) {
            ApplicationContext ctx = new ClassPathXmlApplicationContext("beans-scope.xml");
    
            Car car = (Car) ctx.getBean("car");
            Car car2 = (Car) ctx.getBean("car");
    
            System.out.println(car == car2);
        }
    }

    执行结果:

    通过输出的结果我们可以观察到,两次获取bean的引用并不相等,说明并不是同一个bean,并且调用了两次构造方法,说明创建了两个Car类的对象。

    2)验证prototype模式的bean在容器启动时是否创建

    我们在不改变spring配置的情况下,只执行下面一行代码:

    1 ApplicationContext ctx = new ClassPathXmlApplicationContext("beans-scope.xml");

    执行结果:

    我们可以观察到,控制台上没有任何输出,所以我们可以得出结论,prototype模式下bean是在获取时才创建,而不是在IOC容器启动时创建的。

  • 相关阅读:
    微信小程序音频播放
    jsonp跨域请求-最简单的方法
    mysql explain 正常,但是实际上是全盘扫描
    lnmp运行过程中出现502处理方法
    [Python]利用type()动态创建类
    Django-form表单
    Django-认证系统
    Django-model基础
    Django-MTV
    前端基础之:JQuery(可编辑版)
  • 原文地址:https://www.cnblogs.com/fengyun2019/p/10832851.html
Copyright © 2011-2022 走看看