本文介绍Spring框架中Bean的作用域(singleton/prototype),至于Web环境作用域(request/session)将不做介绍。
Spring框架使用scope属性来配置bean的作用域。
singleton 单例的(默认值).创建容器时创建bean实例.在容器的整个生命周期中只创建这一个bean,
prototype 原型的,容器创建时不创建bean的实例,而在每次请求时创建新的bean实例并返回.
Car类
package com.wusuiwei.spring.beans.autowire;
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...");
}
}
prototype
beans-scope.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--
使用scope属性来配置bean的作用域。
singleton 默认值(单例的).创建容器时创建bean实例.在容器的整个生命周期中只创建这一个bean,
prototype 原型的,容器创建时不创建bean的实例,而在每次请求时创建新的bean实例并返回.
-->
<bean id="car" class="com.wusuiwei.spring.beans.autowire.Car" scope="prototype">
<property name="brand" value="Audi"/>
<property name="price" value="30000"/>
</bean>
</beans>
Main类(测试类)
package com.wusuiwei.spring.beans.scope;
import com.wusuiwei.spring.beans.autowire.Car;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Main {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("beans-scope.xml");
Car car = (Car) context.getBean("car");
Car car2 = (Car) context.getBean("car");
System.out.println(car==car2);
}
}
执行结果:
说明每次容器在每次请求时创建了一个新实例。
Main类(测试类)
package com.wusuiwei.spring.beans.scope;
import com.wusuiwei.spring.beans.autowire.Car;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Main {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("beans-scope.xml");
}
}
执行结果:
分析:执行结果后,未打印“Car's Constructor...”,说明未创建Car实例。
singleton
同样,singleton可以得到以下分析结果:创建容器时创建bean实例.在容器的整个生命周期中只创建这一个bean。