首先,新建一个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指向的类,给该对象赋值。