Spring Bean作用域(singleton、prototype)的生命周期,使用init()、destroy()测试
◎◎◎◎◎◎Spring中的两个作用域:singleton:默认值,容器初始化时创建bean实例,在整个容器的生命周期内只创建这个bean,单例的。prototype:原型的, 容器初始化时不创建bean实例,而在每次请求时都创建一个新的bean实例,并返回。为了更好地理解它们的生命周期,定义bean类的初始化init()和bean的销毁destroy(),来监控一个bean的创建和销...
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()方法。
更多推荐
所有评论(0)