Bean 的作用域

本文深入探讨了Spring框架中Bean的作用域,包括singleton和prototype两种主要类型。通过实例演示了singleton作用域下Bean的初始化过程及共享特性,以及prototype作用域下每次请求都会创建新Bean的特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先,新建一个xml文件

<bean id="car" class="com.autowire.Car">
    <property name="brand" value="Audi"></property>
    <property name="price" value="300000"></property>
</bean>
public class Main {

    public static void main(String[] args) {

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

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

可以看到运行结果为true,这说明两个对象都指向了同一个作用域

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

默认情况下, Spring 只为每个在 IOC 容器里声明的 Bean 创建唯一一个实例, 整个 IOC 容器范围内都能共享该实例所有后续的 getBean() 调用和 Bean 引用都将返回这个唯一的 Bean 实例.该作用域被称为 singleton, 它是所有 Bean 的默认作用域.容器bean:初始化时创建bean的实例,在整个容器的生命周期中只创建这一个bean,单例的。

prototype:原型的,容器初始化时不创建bean的实例,而在每次请求时都创建一个新的bean实例,并返回

                         

现在设置scope属性值为:singleton

<bean id="car" class="com.autowire.Car" scope="singleton">
    <property name="brand" value="Audi"></property>
    <property name="price" value="300000"></property>
</bean>

为了看其运行的顺序,需要给Car类创建一个无参的构造方法

public class Car {

    private String brand;
    private double price;

    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 +
                '}';
    }

    public Car(){
        System.out.println("Car's Constructor...");
    }
}

现在先注释掉Main函数中car对象的实例化、

可以看到输出了

Car's Constructor...

这就说明,当scope选择singleton属性值时,我们创建容器即

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

的时候,car这个bean已经被初始化好了

下面看看当scope选择prototype属性值时

运行程序之后并没有任何的输出,这就说明在创建容器的时候,bean并没有被初始化

当取消Main函数的注释

每次实例化一个Car

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

才会进行bean的初始化,即每请求一个bean(每getbean)都会处初始化这个bean

比如我们在代码中实例化两个

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

代码输出两次构造方法

Car's Constructor...
Car's Constructor...
false

博客中仅仅指出了作用域的两个属性值,在实际学习过程中,需要利用创建无参的构造方法进行验证,方便理解

补充一下什么是容器的初始化和创建容器,请求bean,实例化bean

容器的初始化和创建容器

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

请求一个bean

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

实例化bean:利用请求bean指向的类,给该对象赋值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值