在 Spring 中, 可以在 <bean> 元素的 scope 属性里设置 Bean 的作用域.

bean的五种作用域

这里写图片描述


singleton作用域

默认情况下, Spring 只为每个在 IOC 容器里声明的 Bean 创建唯一一个实例, 整个 IOC 容器范围内都能共享该实例:所有后续的 getBean() 调用和 Bean 引用都将返回这个唯一的 Bean 实例.该作用域被称为 singleton, 它是所有 Bean 的默认作用域。下面使用代码实例讲解:

  • Car类
package com.spring.ioc;

public class Car {

    private String brand;

    private double price;


    public Car() {
        System.out.println("创建Car实例...");
    }

    public String getBrand() {
        return brand;
    }

    public void setBrand(String brand) {
        this.brand = brand;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    @Override
    public String toString() {
        return "Car [brand=" + brand + ", price=" + price + "]";
    }
}

注意Car类的构造函数

public Car() {
    System.out.println("创建Car实例...");
}

配置bean:

<bean id="car" class="com.spring.ioc.Car" scope="singleton">
    <property name="brand" value="BMW"></property>
    <property name="price" value="1000"></property>
</bean>

测试1:

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

运行结果:
这里写图片描述

默认情况下,bean的scope是singleton,该实例在bean容器加载时就开始创建

看下面测试:

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

Car car1 = (Car) ctx.getBean("car");

Car car2 = (Car) ctx.getBean("car");
System.out.println(car1 == car2);

这里写图片描述

car这个bean是单例的,这也是singleton的作用,声明该bean单例


prototype作用域

将bean的scope设置为 prototype

<bean id="car" class="com.spring.ioc.Car" scope="prototype">
    <property name="brand" value="BMW"></property>
    <property name="price" value="1000"></property>
</bean>

测试1:

//加载bean容器
ApplicationContext ctx = new ClassPathXmlApplicationContext("beans-scope.xml");

测试时只加载bean容器,发现并没有创建Car实例。

测试2:

//加载bean容器
ApplicationContext ctx = new ClassPathXmlApplicationContext("beans-scope.xml");

Car car1 = (Car) ctx.getBean("car");

Car car2 = (Car) ctx.getBean("car");
System.out.println(car1 == car2);

使用getBean()方法获取两个bean实例并比较
这里写图片描述

每获取一次bean都会新建一个新的bean实例

其他几个由于不经常用这里就不讲了。


本系列参考视频教程: http://edu.51cto.com/course/1956.html

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐