spring基础知识 (8): bean的作用域



在 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 + "]";
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

注意Car类的构造函数

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

配置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
  • 2
  • 3
  • 4

测试1:

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

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

默认情况下,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);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

这里写图片描述

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
  • 2
  • 3
  • 4

测试1:

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

测试时只加载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);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

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

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

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页