【Spring4.0】SpringBean的作用域

16 篇文章 0 订阅
14 篇文章 0 订阅

一、测试前期需要建立的类


1.代表汽车的Car.java

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");
	}

2.bean的配置文件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">
	<!-- 
		使用bean的scope属性来配置bean的作用域‘
		singleton:默认值,容器初始化时创建bean实例,在整个容器的生命周期只创建一个bean,单例的
		prototype:原型的,容器在初始化时不创建bean实例,而是在每次请求的时候创建一个bean的新实例,并返回
	 -->
	<bean id="car" class="top.cheungchingyin.beans.autowire.Car">
		<property name="brand" value="AuDi"></property>
		<property name="price" value="300000"></property>
	</bean>

</beans>

3.用于测试的主类Main.java

public class main {

	public static void main(String[] args) {
		ApplicationContext ctx = new ClassPathXmlApplicationContext("beans-scope.xml");
		Car car = (Car) ctx.getBean("car");
		Car car2 = (Car) ctx.getBean("car");
		System.out.println(car == car2);
	}
}



二、关于作用域


参考资料:4.4 Bean scopes
SpringBean有五大作用域:

作用域说明
singleton根据Spring IoC容器将单个bean定义范围限定为单个对象实例。
prototype将单个bean定义范围限定为任意数量的对象实例。
request将单个bean定义范围限定为单个HTTP请求的生命周期; 也就是说,每个HTTP请求都有自己的bean实例,它是在单个bean定义的后面创建的。仅在Web感知Spring的上下文中有效ApplicationContext
session将单个bean定义范围限定为HTTP的生命周期Session。仅在Web感知Spring的上下文中有效 ApplicationContext
globalsession将单个bean定义范围限定为全局HTTP的生命周期Session。通常仅在portlet上下文中使用时有效。仅在Web感知Spring的上下文中有效 ApplicationContext



三、singletonprototype的区别


1.当在beans-scope.xml中填写作用域为singleton

(注意!scope="singleton"是bean的默认属性,当没有指定scope的时候默认为singleton

<bean id="car" class="top.cheungchingyin.beans.autowire.Car" scope="singleton">
		<property name="brand" value="AuDi"></property>
		<property name="price" value="300000"></property>
	</bean>

Main.java中测试两个对象carcar2是否相同

ApplicationContext ctx = new ClassPathXmlApplicationContext("beans-scope.xml");
		Car car = (Car) ctx.getBean("car");
		Car car2 = (Car) ctx.getBean("car");
		System.out.println(car == car2);

结果为true,构造器值调用了一次:
这里写图片描述

2.当在beans-scope.xml中填写作用域为prototype

<bean id="car" class="top.cheungchingyin.beans.autowire.Car" scope="prototype">
		<property name="brand" value="AuDi"></property>
		<property name="price" value="300000"></property>
	</bean>

测试结果为:false,构造器调用了
这里写图片描述
singletonprototype的区别其实在于:
singleton的中文意思是单身的(不是单身狗)在容器初始化时创建bean实例,在整个容器的生命周期内置创建一个bean,单例的,所以说无论怎样请求,只会创建一个实例,因而两个对象比较返回的结果是为true,构造器值调用一次。

prototype的中文意思是原型的,容器初始化时不创建bean实例,而是在每次请求是都创建bean实例。所以上面两个对象比较的时候为false,因为两个对象的实例都是不一样的,而且请求了两次,所以构造器也调用了两次。


四、总结


  • 在 Spring 中, 可以在 元素的scope 属性里设置 Bean 的作用域。
  • 默认情况下, Spring 只为每个在 IOC 容器里声明的 Bean 创建唯一一个实例, 整个 IOC 容器范围内都能共享该实例:所有后续的 getBean() 调用和 Bean 引用都将返回这个唯一的 Bean 实例.该作用域被称为 singleton, 它是所有 Bean 的默认作用域。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值