文档章节

Spring框架笔记(七)——Spring IOC容器Bean的作用域

HappyBKs
 HappyBKs
发布于 2015/07/18 22:36
字数 903
阅读 161
收藏 2

每个Bean都有自己的作用域,它们会在特定的时间生成,在特定的范围生存。Spring IOC容器的bean有四种作用域:

其中默认的作用域是singleton,单例模式。也就是我们之前配置的bean的作用域模式,即所有的bean只有一个,并且在一开始就生成了。

prototype则是在每次getBean的时候都会生成一个新的实例。

request则是以每次请求作用作用域,session则是Http Session被创建的时候被创建的,并且作用域适用于WebApplicationContext环境。


好,我们今天主要看看前两者:

我们先将CarBean定义给出,这里我们在构造方法里加入了控制台输出信息。

package com.happyBKs.autowire;

public class CarBean {
	String brand;
	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;
	}
	public CarBean(String brand, double price) {
		super();
		this.brand = brand;
		this.price = price;
	}
	public CarBean() {
		super();
		System.out.println(this.brand+" Constructor ....");
	}
	@Override
	public String toString() {
		return "CarBean [brand=" + brand + ", price=" + price + "]";
	}
	
}

IOC容器配置:\src\main\resources\bean-scopes.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" xmlns:p="http://www.springframework.org/schema/p"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

	<bean id="carBM" class="com.happyBKs.autowire.CarBean" p:brand="BM"
		p:price="400000" scope="singleton" />
	<bean id="carAudi" class="com.happyBKs.autowire.CarBean" p:brand="Audi"
		p:price="300000" scope="prototype" />

</beans>

测试代码:

@Test
	public void testScope1() {
		
		{
			System.out.println("example 1:");
			ApplicationContext ac = new ClassPathXmlApplicationContext("bean-scopes.xml");
			System.out.println("getBean(carBM)");
			CarBean cb = (CarBean) ac.getBean("carBM");
			System.out.println(cb);
		}
	
		{
			System.out.println("example 2:");
			ApplicationContext ac = new ClassPathXmlApplicationContext("bean-scopes.xml");
			System.out.println("getBean(carAudi)");
			CarBean cb = (CarBean) ac.getBean("carAudi");
			System.out.println(cb);
		}
	}

输出结果:

example 1:

七月 18, 2015 10:32:13 下午 org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh

信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@191d7bd5: startup date [Sat Jul 18 22:32:13 CST 2015]; root of context hierarchy

七月 18, 2015 10:32:13 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions

信息: Loading XML bean definitions from class path resource [bean-scopes.xml]

null Constructor ....

getBean(carBM)

CarBean [brand=BM, price=400000.0]

example 2:

七月 18, 2015 10:32:14 下午 org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh

信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@3e9c00ea: startup date [Sat Jul 18 22:32:14 CST 2015]; root of context hierarchy

七月 18, 2015 10:32:14 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions

信息: Loading XML bean definitions from class path resource [bean-scopes.xml]

null Constructor ....

getBean(carAudi)

null Constructor ....

CarBean [brand=Audi, price=300000.0]


注意了,第二个例子中有两个null Constructor ....

第一个是carBM在加载IOC容器配置文件时自动加载的,因为那个bean是singleton的作用域,即使不使用它,也会被构造。

第二个是在getBean时加载的,只有需要时才会被构造。


那么你也许会问?真的是重新被构造了吗?我再给例子吧。

我们分别用同一个容器,getBean两次,看看singleton和protoType作用域下返回对象的区别:

singleton

@Test
	public void testScope2() {
		
		
		
		ApplicationContext ac1 = new ClassPathXmlApplicationContext(
				"bean-scopes.xml");
		CarBean cb1 = (CarBean) ac1.getBean("carBM");
		System.out.println(cb1);
		
		CarBean cb2 = (CarBean) ac1.getBean("carBM");
		System.out.println(cb2);
		
		if(cb1==cb2)
		{
			System.out.println("the same one!");
		}
		else
		{
			System.out.println("different!");
		}
		

	}

输出:

七月 18, 2015 10:45:24 下午 org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh

信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@75e81ab3: startup date [Sat Jul 18 22:45:24 CST 2015]; root of context hierarchy

七月 18, 2015 10:45:24 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions

信息: Loading XML bean definitions from class path resource [bean-scopes.xml]

null Constructor ....

CarBean [brand=BM, price=400000.0]

CarBean [brand=BM, price=400000.0]

the same one!


protoType

@Test
	public void testScope3() {
		
		
		
		ApplicationContext ac1 = new ClassPathXmlApplicationContext(
				"bean-scopes.xml");
		CarBean cb1 = (CarBean) ac1.getBean("carAudi");
		System.out.println(cb1);
		

		CarBean cb2 = (CarBean) ac1.getBean("carAudi");
		System.out.println(cb2);
		
		if(cb1==cb2)
		{
			System.out.println("the same one!");
		}
		else
		{
			System.out.println("different!");
		}
		

	}

输出结果:

七月 18, 2015 10:46:12 下午 org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh

信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@72f9ebcd: startup date [Sat Jul 18 22:46:12 CST 2015]; root of context hierarchy

七月 18, 2015 10:46:12 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions

信息: Loading XML bean definitions from class path resource [bean-scopes.xml]

null Constructor ....

null Constructor ....

CarBean [brand=Audi, price=300000.0]

null Constructor ....

CarBean [brand=Audi, price=300000.0]

different!



但是,请注意,如果是不同的ApplicationContext,也就是两个不同的容器,那么无论什么作用域类型,返回的对象一定不是同一个。





© 著作权归作者所有

共有 人打赏支持
HappyBKs

HappyBKs

粉丝 654
博文 306
码字总数 481268
作品 0
浦东
程序员
私信 提问
Spring基础知识汇总 Java开发必看

Spring简介 Spring框架由Rod Johnson开发,2004年发布了Spring框架的第一版。Spring是一个从实际开发中抽取出来的框架,因此它完成了大量开发中的通用步骤,留给开发者的仅仅是与特定应用相关...

像风一样i
2018/08/14
0
0
全国监理工程师培训班结业证书 广东 浙江 工程师证 工程师证样本

什么是Spring beans? Spring beans 是那些形成Spring应用的主干的java对象。它们被Spring IOC容器初始化,装配,和管理。这些beans通过容器中配置的元数据创建。比如,以XML文件中 的形式定义...

spring小鸟
2018/08/26
0
0
Spring应用学习——IOC

Spring简介 1. Spring的出现是为了取代EJB(Enterprise JavaBean)的臃肿、低效、脱离现实的缺点。Spring致力于J2EE应用的各层(表现层、业务层、持久层)的解决方案,Spring是企业应用开发的...

江左煤郎
2018/11/16
0
0
Spring框架笔记(三)——Spring容器、属性注入和构造器注入详解

Spring 容器 在 Spring IOC 容器读取 Bean 配置创建 Bean 实例之前, 必须对它进行实例化. 只有在容器实例化后, 才可以从 IOC 容器里获取 Bean 实例并使用. Spring 提供了两种类型的 IOC 容器...

HappyBKs
2015/07/12
0
5
2019年一线大厂春招:Spring面试题和答案合集(上篇)

什么是spring? Spring 是个java企业级应用的开源开发框架。Spring主要用来开发Java应用,但是有些扩展是针对构建J2EE平台的web应用。Spring 框架目标是简化Java企业级应用开发,并通过POJO为...

别打我会飞
03/31
0
0

没有更多内容

加载失败,请刷新页面

加载更多

大数据剖析热点新闻:996、巴黎圣母院、奔驰维权为什么成为本周热搜

智能大数据专家表示:每一段重要的时期都会有一串隐秘的数字密码,请往下看: 本周共有50条新闻,作为嗅嗅的样本进行数据分析,得出以下统计图: 1.新闻热词折线统计图 在新闻标题及正文中,...

forespider
15分钟前
0
0
Coding and Paper Letter(六十四)

资源整理。 1 Coding: 1.交互式瓦片编辑器。 tile playground 2.R语言包autokeras,autokeras的R接口。autokeras是一个开源的自动机器学习的软件。 autokeras 3.斯坦福网络分析平台,用于网络...

胖胖雕
52分钟前
1
0
最简单的cd命令是个大坑!

BASH Shell 是大多 Linux 发行版的默认 shell,BASH 有一些自己的内置命令,cd 就是其中的一个。 在centos6里面,系统中不存在 cd 的二进制文件。但是你仍然可以运行该命令,这是因为 cd 是 ...

gaolongquan
今天
1
0
spring获取bean的几种方式

使用jdk:1.8、maven:3.3.3 spring获取Bean的方式 pom.xml文件内容: <?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="......

Vincent-Duan
今天
2
0
一段话系列-Linux中IO的同步、异步、阻塞、非阻塞

首先我们框定一下背景,我们探讨的是Linux系统下的IO模型。 同步和异步是针对内核操作数据而言的,同步是指内核串行顺序操作数据,异步是指内核并行(或并发)操作数据,然后通过回调的方式通...

EasyProgramming
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部