您的位置:首页 > 编程语言 > Java开发

Spring Bean作用域(singleton、prototype)的生命周期,使用init()、destroy()测试

2019-06-12 07:27 1711 查看
版权声明:版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_41083009/article/details/90743719

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、测试结果:
激动人心的时刻来了,编写程序的人最开心的莫过于测试成功的那一刻。
23ff8 (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()方法。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: