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
com.bean.LifeBean@523f2bb1
原文地址:https://www.cnblogs.com/smellpawn/p/10800338.html