zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    c# System.Object类和数据的安全转型
    计算机内存的组织方式
    c# ref和out参数
    C# 复制值类型的变量和类
    PCB 布线,直角线,差分线,蛇形线
    c# 静态方法和数据
    c# 类的知识
    appium中从activity切换到html
    No Desktop License Servers available to provide a license
    adb命令连接Android模拟器夜神模拟器
  • 原文地址:https://www.cnblogs.com/smellpawn/p/10800338.html
Copyright © 2011-2022 走看看