1、代码和配置文件准备
1.1、测试类(user.java)
1 public class User { 2 private int id; 3 private String name; 4 private int age; 5 6 public int getId() { 7 return id; 8 } 9 public void setId(int id) { 10 this.id = id; 11 } 12 public String getName() { 13 return name; 14 } 15 public void setName(String name) { 16 this.name = name; 17 } 18 public int getAge() { 19 return age; 20 } 21 public void setAge(int age) { 22 this.age = age; 23 } 24 25 public void say() { 26 System.out.println("hello man "); 27 } 28 29 public User() { 30 super(); 31 // TODO Auto-generated constructor stub 32 } 33 34 //初始化方法定义 35 public void init() { 36 System.out.println("user init..."); 37 } 38 39 //销毁方法定义 40 public void destory() { 41 System.out.println("user destory..."); 42 } 43 44 45 }
1.2、配置文件(applicationcontext.xml)
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xmlns:aop="http://www.springframework.org/schema/aop" 5 xmlns:context="http://www.springframework.org/schema/context" 6 xmlns:tx="http://www.springframework.org/schema/tx" 7 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 8 http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd 9 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd 10 http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd"> 11 12 <!-- 配置:单例、初始化方法、销毁方法 与user.java对应 --> 13 <bean id="user" class="com.spring.mybean.User" init-method="init" destroy-method="destory" scope="singleton"></bean> 14 </beans>
1.3、测试方法
1 @Test 2 public void testLoad() { 3 ApplicationContext context = new ClassPathXmlApplicationContext("classpath:applicationcontext.xml"); 4 Object bean = context.getBean("user"); 5 ClassPathXmlApplicationContext cxf = (ClassPathXmlApplicationContext)context; 6 cxf.close(); 7 }
2、输出定位
2.1、测试条件(单例)
在测试方法的第3行打断点,当走完第3行,到达第4行,控制台输出user init ...,说明user bean在容器初始化即applicationcontext.xml加载的时候就初始化成功了。
断点继续往下,当走完第6行,控制台输出 user destory ...,说明user bean已经被销毁了。
2.2、测试条件(单例,lay-init="true")
修改配置文件,测试类代码同上
1 <bean id="user" class="com.spring.mybean.User" init-method="init" destroy-method="destory" scope="singleton" lazy-init="true"></bean>
在测试方法的第3行打断点,当走完第3行,到达第4行,控制台没有输出user init ...,说明user bean在容器初始化即applicationcontext.xml加载的时候并没有初始化,当走完第4行,到达底5行,控制台输出user init ...,说明user bean 在从容器获取user bean 的时候进行的初始化。销毁也是在走完第6行的时候进行的user bean销毁操作.
2.3、测试条件(多例,lay-init="true")
修改配置文件
1 <bean id="user" class="com.spring.mybean.User" init-method="init" destroy-method="destory" scope="prototype" lazy-init="true"></bean>
在测试方法的第3行打断点,当走完第3行,到达第4行,控制台没有输出user init ...,说明user bean在容器初始化即applicationcontext.xml加载的时候并没有初始化,当走完第4行,到达底5行,控制台输出user init ...,说明user bean 在从容器获取user bean 的时候进行的初始化。走完第6行,控制台也没有输出user destory ...,说明当bean设置为多例的时候,容器销毁的时候bean并没有调用destory方法
3、总结
3.1、单例,没有设置lay-init="true"时,bean在容器加载的时候进行的初始化,在容器关闭的时候进行销毁
3.2、单例,设置lay-init="true"时,bean在从容器中获取相关bean时,或者说调用实例对象的时候进行的初始化,在容器关闭的时候进行销毁
3.3、当scope不是单例即singleton时,初始化周期同上,但销毁方法不会触发