`
hz_chenwenbiao
  • 浏览: 991956 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

spring bean的生命周期(转)

阅读更多

分为定义,初始化,使用,消亡
写个例子测试一下:
第一步:建一个类User,代码如下:
java 代码
  1. package test.lyx;   
  2. publicclass User {   
  3.     private String userName;   
  4.     public String getUserName() {   
  5.         returnuserName;   
  6.     }   
  7.     publicvoid setUserName(String userName) {   
  8.         this.userName = userName;   
  9.     }   
  10. }   
第二步:将User注入.applicationContext.xml配置如下:
xml 代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">  
  3. <beans>  
  4.         <bean id="user" class="test.lyx.User" abstract="false"  
  5.         singleton="true" lazy-init="default" autowire="byType"  
  6.         dependency-check="default">  
  7.         <property name="userName">  
  8.             <value>liuyuanxi</value>  
  9.         </property>  
  10.     </bean>  
  11. </beans>  
第三步:建一个类TestMain测试一下:
java 代码
  1. package test.lyx;   
  2. import org.springframework.context.ApplicationContext;   
  3. import org.springframework.context.support.FileSystemXmlApplicationContext;   
  4. publicclass TestMain {   
  5.     publicstaticvoid main(String[] args) {   
  6.     ApplicationContext context=new FileSystemXmlApplicationContext("test/lyx/applicationContext.xml");   
  7.         User user1=(User)context.getBean("user");   
  8.         System.out.println(user1.getUserName());   
  9.     }   
  10. }  
这样运行该类会打出liuyuanxi.那么这几步就是bean的定义和使用.
接下来我们在User类中加上两个方法:init clear,当然方法明任你起.
java 代码
  1. publicvoid init(){   
  2.        this.userName="zhangsan";   
  3.    }   
  4.    publicvoid clear(){   
  5.        this.userName=null;   
  6.    }   
然后将配置文件修改如下:
xml 代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">  
  3. <beans>  
  4.         <bean id="user" class="test.lyx.User" abstract="false"  
  5.         singleton="true" lazy-init="default" autowire="byType"  
  6.         dependency-check="default" init-method="init" destroy-method="clear">  
  7.         <property name="userName">  
  8.             <value>liuyuanxi</value>  
  9.         </property>  
  10.     </bean>  
  11. </beans>  
这里面的红线部分就是修改的内容.如果init-method属性设置了方法,那么就会在bean初始化的时候被执行.而destroy-method在消毁之前执行.
第二种方法:(实现初始化,和消毁的两个接口)
可以不在配置文件中指定init-methoddestroy-method两个方法.
我们把User类修改一下:代码如下:
java 代码
  1. package test.lyx;   
  2. import org.springframework.beans.factory.InitializingBean;   
  3. import org.springframework.beans.factory.DisposableBean;   
  4. publicclass User implements InitializingBean,DisposableBean{   
  5.     private String userName;   
  6.     public String getUserName() {   
  7.         returnuserName;   
  8.     }   
  9.     publicvoid setUserName(String userName) {   
  10.         this.userName = userName;   
  11.     }   
  12.     publicvoid init(){   
  13.         this.userName="zhangsan";   
  14.     }   
  15.     publicvoid clear(){   
  16.         this.userName=null;   
  17.     }   
  18.     publicvoid afterPropertiesSet() throws Exception {   
  19.         this.userName="wangwu";// TODO Auto-generated method stub   
  20.     }   
  21.     
  22.     publicvoid destroy() throws Exception {   
  23.         this.userName=null;// TODO Auto-generated method stub   
  24.         }   
  25. }   
修改过后的类,就是在原来的基础上,实现两个接口InitializingBean,DisposableBean也就是初始化和消毁的接口,这里我们要把InitializingBean接口里的afterPropertiesSet方法给覆盖掉,也就是将初始化的东西写在这个方法以里面.同时也要把DisposableBean接口的destroy方法覆盖掉,
消毁的东西写在这个方法里.这样的话,就无需在配置文件中配置init-methoddestroy-method两个方法.
整个的过程就是bean的生命周期.

另转:
Spring中Bean的生命周期 在spring中,从BeanFactory或ApplicationContext取得的实例为Singleton,也就是预设为每一个Bean的别名只能维持一个实例,而不是每次都产生
一个新的对象
使用Singleton模式产生单一实例,对单线程的程序说并不会有什么问题,但对于多线程的程序,就必须注意安全(Thread-safe)的议题,防止多个线程
同时存取共享资源所引发的数据不同步问题。
然而在spring中 可以设定每次从BeanFactory或ApplicationContext指定别名并取得Bean时都产生一个新的实例:例如:
<bean singleton="false">
在spring中,singleton属性默认是true,只有设定为false,则每次指定别名取得的Bean时都会产生一个新的实例
一个Bean从创建到销毁,如果是用BeanFactory来生成,管理Bean的话,会经历几个执行阶段:
    1:Bean的建立:
          有BeanFactory读取Bean定义文件,并生成各个Bean实例
    2:属性注入:
          执行相关的Bean属性依赖注入
    3:BeanNameAware的setBeanName():
          如果Bean类有实现org.springframework.beans.BeanNameAware接口,则执行它的setBeanName()方法
    4:BeanFactoryAware的setBeanFactory():
          如果Bean类有实现org.springframework.beans.factory.BeanFactoryAware接口,则执行它的setBeanFactory()方法
    5:BeanPostProcessors的ProcessBeforeInitialization()
          如果任何的org.springframework.beans.factory.config.BeanPostProcessors实例与Bean实例相关。则执行BeanPostProcessors实例
          的processBeforeInitialization()方法
    6:initializingBean的afterPropertiesSet():
          如果Bean类已实现org.springframework.beans.factory.InitializingBean接口,则执行他的afterProPertiesSet()方法
    7:Bean定义文件中定义init-method:
          可以在Bean定义文件中使用"init-method"属性设定方法名称例如:
          <bean calss="onlyfun.caterpillar.HelloBean" init-method="initBean">
          如果有以上设置的话,则执行到这个阶段,就会执行initBean()方法
    8:BeanPostProcessors的ProcessaAfterInitialization()
          如果有任何的BeanPostProcessors实例与Bean实例关联,则执行BeanPostProcessors实例的ProcessaAfterInitialization()方法
    9:DisposableBean的destroy()
          在容器关闭时,如果Bean类有实现org.springframework.beans.factory.DisposableBean接口,则执行他的destroy()方法
    10:Bean定义文件中定义destroy-method
          在容器关闭时,可以在Bean定义文件中使用"destroy-method"属性设定方法名称,例如:
          <bean destroy-method="destroyBean">
          如果有以上设定的话,则进行至这个阶段时,就会执行destroyBean()方法,如果是使用ApplicationContext来生成并管理Bean的话
          则稍有不同,使用ApplicationContext来生成及管理Bean实例的话,在执行BeanFactoryAware的setBeanFactory()阶段后,若Bean
          类上有实现org.springframework.context.ApplicationContextAware接口,则执行其setApplicationContext()方法,接着才执行
          BeanPostProcessors的ProcessBeforeInitialization()及之后的流程 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics