spring框架——bean的作用域

1 前言

在 bean 标签的 scope 属性中可以选择不同作用域,主要有 prototype、request、session、singleton,如下:

  • prototype:每次从容器中调用 bean 时,都生成一个新的 bean
  • request:每次 HTTP 请求,都会创建一个 bean,仅适用于 WebApplicationContext 环境
  • session:同一个 HTTP Session 共享一个 bean,仅适用于 WebApplicationContext 环境
  • singleton:spring IoC 容器仅存在一个 bean,以单例模式存在,scope 的默认值

本文仅介绍 singleton 和 prototype

待测试的 bean 所属类为 Student,如下:

Student.java

public class Student {
	private Integer sid;
	private String sname;
	
	public Student() {
		System.out.println("构造方法");
	}

	public String getSname() {
		return sname;
	}
	
	public void setSname(String sname) {
		this.sname = sname;
	}

	public Integer getSid() {
		return sid;
	}

	public void setSid(Integer sid) {
		this.sid = sid;
	}
}

2 作用域为 singleton

applicationContext.xml


		
	
		
		
	

Test.java

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

public class Test {

	public static void main(String[] args) {
		ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
		Student s1=ac.getBean("student",Student.class);
		Student s2=ac.getBean("student",Student.class);
		System.out.println(s1==s2);
	}
}

 运行结果:

构造方法
true

 构造方法仅执行一次,并且 s1==s2 为 true,说明容器中仅创建一个 bean。当 Test.java 只加载容器,不加载 bean 时,构造方法也会执行一次,即作用域为 singleton(单例模式)时, bean 在容器加载的时候就已经创建。测试如下:

Test.java

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

public class Test {

	public static void main(String[] args) {
		ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
	}
}

运行结果:

构造方法

 3 作用域为 prototype

applicationContext.xml


		
	
		
		
	

Test.java

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

public class Test {

	public static void main(String[] args) {
		ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
		Student s1=ac.getBean("student",Student.class);
		Student s2=ac.getBean("student",Student.class);
		System.out.println(s1==s2);
	}
}

运行结果:

构造方法
构造方法
false

构造方法执行了2次,并且 s1==s2 为 false,说明创建了2个 bean。另外,当只加载容器,不加载 bean 时,没有输出 “构造方法”,即作用域为 prototype 时,bean 在加载 bean 的时候创建。

你可能感兴趣的:(spring)