Spring Bean作用的域

版权声明:博客知识产权来源命运的信徒,切勿侵权 https://blog.csdn.net/qq_37591637/article/details/85114762

知识点介绍

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


demo如下

package cn.com.day03;

public class Address {
private String add;
private String id;
public void setAdd(String add) {
	this.add = add;
}
public void setId(String id) {
	this.id = id;
}
@Override
public String toString() {
	return "Address [add=" + add + ", id=" + id + "]";
}
public Address() {
	// TODO Auto-generated constructor stub
	System.out.println("address constructor....");
}
}
<!-- bean的作用域 -->
<bean id="a2" class="cn.com.day03.Address" p:add="anhui" p:id="1203" scope="singleton"></bean>

测试类如下

package cn.com.day03;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TestMain {
public static void main(String[] args) {
	//1.创建ioc容器
	ApplicationContext cox=new ClassPathXmlApplicationContext("AutoWire.xml");
	//2.获取bean
	Address c1=(Address) cox.getBean("a2");
	Address c2=(Address) cox.getBean("a3");
	System.out.println(c1);		
	System.out.println(c2);	
	
}
}

结果如下

 

在视频上,老师说scope="singleton"是创建单实例的,在初始化容器的时候,就开始初始化bean了;后来就使用一个就可以了;

但是我给出来的是3个构造器打印结果,这个是为什么呢》

因为我的bean配置文件里面有三个Address类型的bean配置,初始化容器的时候,就会调用三次构造器方法;

但是对于同一个配置如bean名称是a2的,a2构造器只会创建一次,以后每次关于a2的,都会使用一个,不会再多创建了

我获取两个a2的bean名称

package cn.com.day03;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TestMain {
public static void main(String[] args) {
	//1.创建ioc容器
	ApplicationContext cox=new ClassPathXmlApplicationContext("AutoWire.xml");
	//2.获取bean
	Address c1=(Address) cox.getBean("a2");
	Address c2=(Address) cox.getBean("a2");
	System.out.println(c1);		
	System.out.println(c2);	
	
}
}

控制台结果如下


scope="prototype"

配置文件如下

<bean id="a2" class="cn.com.day03.Address" p:add="anhui" p:id="1203" scope="prototype"></bean>

测试类如下;

package cn.com.day03;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TestMain {
public static void main(String[] args) {
	//1.创建ioc容器
	ApplicationContext cox=new ClassPathXmlApplicationContext("AutoWire.xml");
	//2.获取bean
	Address c1=(Address) cox.getBean("a2");
	Address c2=(Address) cox.getBean("a2");
	System.out.println(c1);		
	System.out.println(c2);	
	
}
}

结果如下

原型的作用域,在初始化的 不会创建bean的,每一次调用都会重新创建一个

但是

为什么是4个呢?不应该是2个么?

因为我的配置文件里面有三个Address类型的bean配置,我只设置了a2是原型的,其他还是单个示例的

所以在创建容器的时候,另外两个单个示例的会调用构造器,打印出两条信息;

然后原型的不会打印;

在调用两次a2的时候,单个示例不会打印信息了,而原型的每调用一次就打印一次信息,总共2次。

所以控制台信息是4条!

猜你喜欢

转载自blog.csdn.net/qq_37591637/article/details/85114762