spring中bean的生命周期
Posted smellpawn
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring中bean的生命周期相关的知识,希望对你有一定的参考价值。
说明一下自己对bean的生命周期的理解,有不妥的地方请指正。
在说明前可以思考一下Servlet的生命周期:实例化,初始init,接收请求service,销毁destroy;
Spring上下文中的Bean也类似,如下
1 Spring对bean进行实例化,默认bean是单例;
2 Spring对bean进行依赖注入;(相当于告诉spring 我是谁,我需要谁,什么时候需要/实现依赖注入有两种方式,一种是注解,另一种是xml配置)
3 如果bean实现了BeanNameAware接口,spring将bean的id传给setBeanName()方法;(相当于让Bean获取自己在BeanFactory配置中的名字。而且Bean之中一定要有个String类型变量来保存BeanName的值)
4 如果bean实现了BeanFactoryAware接口,spring将调用setBeanFactory方法,将BeanFactory实例传进来;(让Bean获取配置他们的BeanFactory的引用)
5如果bean实现了ApplicationContextAware接口,它的setApplicationContext()方法将被调用,将应用上下文的引用传入到bean中;(通过该applicationContext实例变量来访问容器本身。)
6如果bean实现了BeanPostProcessor接口,它的postProcessBeforeInitialization方法将被调用;()
7如果bean实现了InitializingBean接口,spring将调用它的afterPropertiesSet接口方法,类似的如果bean使用了init-method属性声明了初始化方法,该方法也会被调用;
8如果bean实现了BeanPostProcessor接口,它的postProcessAfterInitialization接口方法将被调用;
9此时bean已经准备就绪,可以被应用程序使用了,他们将一直驻留在应用上下文中,直到该应用上下文被销毁;
10若bean实现了DisposableBean接口,spring将调用它的distroy()接口方法。同样的,如果bean使用了destroy-method属性声明了销毁方法,则该方法被调用;
流程图如下:
其实很多时候我们并不会真的去实现上面说描述的那些接口,那么下面我们就除去那些接口,针对bean的单例和非单例来描述下bean的生命周期:
Spring在读取xml文件的时候,就会创建对象。在创建对象的时候先调用构造器,然后调用init-method属性值中所指定的方法。对象在被销毁的时候,会调用destroy-method属性值中所指定的方法(例如调用Container.destroy()方法的时候)。写一个测试类,代码如下:
1 public class LifeBean { 2 private String name; 3 4 public LifeBean(){ 5 System.out.println("LifeBean()构造函数"); 6 } 7 public String getName() { 8 return name; 9 } 10 11 public void setName(String name) { 12 System.out.println("setName()"); 13 this.name = name; 14 } 15 16 public void init(){ 17 System.out.println("this is init of lifeBean"); 18 } 19 20 public void destroy(){ 21 System.out.println("this is destroy of lifeBean " + this); 22 } 23 }
life.xml配置如下:
<bean id="life_singleton" class="com.bean.LifeBean" scope="singleton" init-method="init" destroy-method="destroy" lazy-init="true"/>
测试代码
1 public class LifeTest { 2 @Test 3 public void test() { 4 AbstractApplicationContext container = 5 new ClassPathXmlApplicationContext("life.xml"); 6 LifeBean life1 = (LifeBean)container.getBean("life"); 7 System.out.println(life1); 8 container.close(); 9 } 10 }
执行结果:
LifeBean()构造函数 this is init of lifeBean [email protected]
以上是关于spring中bean的生命周期的主要内容,如果未能解决你的问题,请参考以下文章