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()方法。
相关文章推荐
- Spring init-method和destroy-method 的使用
- 以软件开发生命周期的过程来说明不同测试的使用情况
- 总结一下,以软件生命周期来说明不同的测试的使用情况
- 以软件开发生命周期来说明各种测试的使用情况
- 以软件开发生命周期来说明不同的测试的使用情况
- Hibernate 使用JUnit 测试出现java.lang.NoSuchMethodError: org.objectweb.asm.ClassWriter.<init>(I)V
- 以软件开发生命周期来说明不同的测试的使用情况
- 使用SiftGPU遇到问题:freeglut ERROR: Function <glutDestroyWindow> called without first calling 'glutInit'.
- spring 中 init-method 和 destroy-method 的使用方式
- 软件开发生命周期中测试的使用情况
- 以软件开发生命周期来说明不同的测试的使用情况
- 以软件开发生命周期来说明不同的测试的使用情况
- 在spring来管理实例对象prototype和singleton的选择.针对action如何使用
- 以软件开发生命周期来说明不同的测试使用情况
- Spring init-method和destroy-method属性的使用
- asp.net 2.0生命周期 以及Page_Load Page_Init方法使用原理
- 总结一下,以软件开发生命周期来说明不同的测试的使用情况
- 使用简单的J2ME程序测试MIDlet的生命周期
- asp.net 2.0生命周期 以及Page_Load Page_Init方法使用原理
- 以软件开始生命周期来说明不同的测试的使用情况