Spring 学习笔记 7. 尚硅谷_佟刚_Spring_Bean 的作用域

时间:2023-03-09 09:36:40
Spring 学习笔记 7. 尚硅谷_佟刚_Spring_Bean 的作用域

1,理论

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

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

Spring 学习笔记 7. 尚硅谷_佟刚_Spring_Bean 的作用域

2,实践

package com.zsq;

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 + "]";
} }

配置文件

<bean id="car" class="com.zsq.Car"  p:brand="audi" p:price="22222"></bean>

主方法

package com.zsq;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; public class Main { public static void main(String[] args) {
// TODO Auto-generated method stub
ApplicationContext ctx = new ClassPathXmlApplicationContext("beans-autowire.xml"); Car car = (Car) ctx.getBean("car");
Car car1 = (Car) ctx.getBean("car");
System.out.println(car == car1);
} }

结果返回的是:

Spring 学习笔记 7. 尚硅谷_佟刚_Spring_Bean 的作用域

其实在配置文件中,默认的作用域是单例模式的就是使用singleton。

Spring 学习笔记 7. 尚硅谷_佟刚_Spring_Bean 的作用域

因此每次创建一个Car对象,其实都是产生一个实例

Spring 学习笔记 7. 尚硅谷_佟刚_Spring_Bean 的作用域

从上面我们也看到scope还有其他的属性值,其中第一个prototype意思是原型。指的是每次创建一个对象的时候都会产生一个实例。

这个时候结果就不一样了:

Spring 学习笔记 7. 尚硅谷_佟刚_Spring_Bean 的作用域

在Car类代码中加一个无参的构造函数。

Spring 学习笔记 7. 尚硅谷_佟刚_Spring_Bean 的作用域

在singleton模式下:

Spring 学习笔记 7. 尚硅谷_佟刚_Spring_Bean 的作用域

再看一个:

Spring 学习笔记 7. 尚硅谷_佟刚_Spring_Bean 的作用域

这说明在singleton模式下,在没有创建对象之前就已经初始化了。

在prototype模式下

Spring 学习笔记 7. 尚硅谷_佟刚_Spring_Bean 的作用域

Spring 学习笔记 7. 尚硅谷_佟刚_Spring_Bean 的作用域

Spring 学习笔记 7. 尚硅谷_佟刚_Spring_Bean 的作用域

以上结果显示在原型模式进行创建对象时候,不初始化bean实例,只初始化对象。