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容器启动时创建的。

猜你喜欢

转载自www.cnblogs.com/fengyun2019/p/10832851.html