Spring中的两个作用域:
singleton:默认值,容器初始化时创建bean实例,在整个容器的生命周期内只创建这个bean,单例的。
prototype:原型的, 容器初始化时不创建bean实例,而在每次请求时都创建一个新的bean实例,并返回。


为了更好地理解它们的生命周期,定义bean类的初始化init()和bean的销毁destroy(),来监控一个bean的创建和销毁过程。并在配置文件声明这些方法。

1、首先是配置文件的编写:
在配置文件(applicationContext.xml)添加scope=“xxx”作用域,并配置初始化和销毁的方法。

<bean id="user" class="com.bean.User"
  	scope="singleton" init-method="init" destroy-method="destroy">
<?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="user" class="com.bean.User"
  	scope="singleton" init-method="init" destroy-method="destroy">
  		<!-- 构造方法注入 -->
  		<constructor-arg value="小明"></constructor-arg>
  		<constructor-arg value="123"></constructor-arg>
  	</bean>
 </beans>

2、在User实体类中添加init()、destroy()方法。

package com.bean;

public class User {
	
	private String username;
    private String password;
    
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	
	public User() {
		super();
		// TODO Auto-generated constructor stub
		System.out.println("无参构造方法");
	}
	
	public User(String username, String password) {
		super();
		this.username = username;
		this.password = password;
	}
	
	@Override
	public String toString() {
		return "User [username=" + username + ", password=" + password + "]";
	}

	public void init(){
		System.out.println("init......");
	}
	
	public void destroy(){
		System.out.println("destroy......");
	}
	
}

3、单元测试编写:

package com.test;

import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.bean.User;

public class Test {
	public static void main(String[] args) {
		ClassPathXmlApplicationContext l1 = new ClassPathXmlApplicationContext("applicationContext.xml");
		
		User user = l1.getBean("user",User.class);
		System.out.println(user);
		
		User user2 = l1.getBean("user",User.class);
		System.out.println(user2);
		System.out.println(user==user2);//比较
		
		l1.close();//关闭流
		//文件流用完之后必须及时通过close方法关闭,否则会一直处于打开状态,直至程序停止,增加系统负担。
	}

}

4、测试结果:
激动人心的时刻来了,编写程序的人最开心的莫过于测试成功的那一刻。
(1)首先测试scope=“singleton”(默认值)的情况:

  	<bean id="user" class="com.bean.User"
  	scope="singleton" init-method="init" destroy-method="destroy">

在这里插入图片描述

从打印结果可以看出,首先初始化生成实例,整个过程只创建了一个bean,然后执行销毁方法,注意执行close()方法,不然不会执行destroy()的哦!

(2)然后测试scope=“prototype”(默认值)的情况:

  	<bean id="user" class="com.bean.User"
  	scope="prototype" init-method="init" destroy-method="destroy">

在这里插入图片描述

忽略掉第一个init,可以看出,prototype每次从容器中调用bean时,都会返回一个新的实例,而不会执行destroy()方法。


Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐