spring中Bean的生命周期总结

标签: spring bean 生命周期 | 发表时间:2013-05-13 07:51 | 作者:chrp99
出处:http://blog.csdn.net

spring中在ApplicationContext或在BeanFactory中Bean的生命周期总结

 Spring中Bean的生命周期,在学习spring的过程中bean的生命周期理解对学习spring有很大的帮助,下面我就分别介绍在ApplicationContext和BeanFactory中Bean的生命周期。

1、在ApplicationContext中Bean的生命周期

生命周期执行的过程如下:

1、需找所有的bean根据bean定义的信息来实例化bean

2、使用依赖注入,spring按bean定义信息配置bean的所有属性

3、若bean实现了BeanNameAware接口,工厂调用Bean的setBeanName()方法传递bean的ID。

4、若bean实现了BeanFactoryAware接口,工厂调用setBeanFactory() 方法传入工厂自身。

5、若bean实现了ApplicationContextAware()接口,setApplicationContext()方法会被调用

6、若BeanPostProcessor和bean关联,

则它们的postProcessBeforeInitialization()方法被调用

7、若bean指定了init-method="init"方法、,它将被调用。

8、若有BeanPostProcessor和bean关联,

     则它们的postProcessAfterInitialization()方法被调用

    注意:通过已上操作,此时的Bean就可以被应用的系统使用,并讲保留在BeanFactory工厂中直到不再需要为止.但我们也可以通过9或者10进行销毁

9、若bean实现了DisposableBean接口,distroy()方法被调用

10、如果指定了destroy-method="close"定制的销毁方法,就调用这个方法

案例分析:

   创建一个实体Bean代码如下:

  1. package www.csdn.spring.dao;  
  2.   
  3.   
  4. import org.springframework.beans.BeansException;  
  5.   
  6. import org.springframework.beans.factory.BeanFactory;  
  7.   
  8. import org.springframework.beans.factory.BeanFactoryAware;  
  9.   
  10. import org.springframework.beans.factory.BeanNameAware;  
  11.   
  12. import org.springframework.beans.factory.DisposableBean;  
  13.   
  14. import org.springframework.beans.factory.InitializingBean;  
  15.   
  16. import org.springframework.context.ApplicationContext;  
  17.   
  18. import org.springframework.context.ApplicationContextAware;  
  19.   
  20.   
  21. public class HelloDaoImpl implements BeanNameAware, BeanFactoryAware,  
  22.   
  23. InitializingBean, ApplicationContextAware, DisposableBean {  
  24.   
  25.   
  26. private String content;  
  27.   
  28.   
  29. public HelloDaoImpl() {  
  30.   
  31. System.out.println("----------HelloDaoImpl实例化");  
  32.   
  33. }  
  34.   
  35.   
  36. public void setContent(String content) {  
  37.   
  38. System.out.println("----------通过依赖注入的内容是:" + content);  
  39.   
  40. this.content = content;  
  41.   
  42. }  
  43.   
  44.   
  45. @Override  
  46.   
  47. public void setBeanName(String beanId) {  
  48.   
  49. System.out.println("----------输出BeanId:" + beanId);  
  50.   
  51. }  
  52.   
  53.   
  54. @Override  
  55.   
  56. public void setBeanFactory(BeanFactory factory) throws BeansException {  
  57.   
  58. System.out.println("----------factory:" + factory.getClass());  
  59.   
  60.   
  61. }  
  62.   
  63.   
  64. @Override  
  65.   
  66. public void setApplicationContext(ApplicationContext applicationContext)  
  67.   
  68. throws BeansException {  
  69.   
  70. System.out.println("----------" + applicationContext);  
  71.   
  72.   
  73. }  
  74.   
  75.   
  76. @Override  
  77.   
  78. public void afterPropertiesSet() throws Exception {  
  79.   
  80. System.out.println("----------afterPropertiesSet");  
  81.   
  82. }  
  83.   
  84.   
  85. public void init() {  
  86.   
  87. System.out.println("----------初始化方法");  
  88.   
  89. }  
  90.   
  91.   
  92. @Override  
  93.   
  94. public void destroy() throws Exception {  
  95.   
  96. System.out.println("----------bean被销毁");  
  97.   
  98.   
  99. }  
  100.   
  101.   
  102. public void close() {  
  103.   
  104. System.out.println("----------close");  
  105.   
  106. }  
  107.   
  108.   
  109. }  
package www.csdn.spring.dao;


import org.springframework.beans.BeansException;

import org.springframework.beans.factory.BeanFactory;

import org.springframework.beans.factory.BeanFactoryAware;

import org.springframework.beans.factory.BeanNameAware;

import org.springframework.beans.factory.DisposableBean;

import org.springframework.beans.factory.InitializingBean;

import org.springframework.context.ApplicationContext;

import org.springframework.context.ApplicationContextAware;


public class HelloDaoImpl implements BeanNameAware, BeanFactoryAware,

InitializingBean, ApplicationContextAware, DisposableBean {


private String content;


public HelloDaoImpl() {

System.out.println("----------HelloDaoImpl实例化");

}


public void setContent(String content) {

System.out.println("----------通过依赖注入的内容是:" + content);

this.content = content;

}


@Override

public void setBeanName(String beanId) {

System.out.println("----------输出BeanId:" + beanId);

}


@Override

public void setBeanFactory(BeanFactory factory) throws BeansException {

System.out.println("----------factory:" + factory.getClass());


}


@Override

public void setApplicationContext(ApplicationContext applicationContext)

throws BeansException {

System.out.println("----------" + applicationContext);


}


@Override

public void afterPropertiesSet() throws Exception {

System.out.println("----------afterPropertiesSet");

}


public void init() {

System.out.println("----------初始化方法");

}


@Override

public void destroy() throws Exception {

System.out.println("----------bean被销毁");


}


public void close() {

System.out.println("----------close");

}


}

 

创建BeanPostProcessor实现类

  1. package www.csdn.spring.dao;  
  2.   
  3.   
  4. import org.springframework.beans.BeansException;  
  5.   
  6. import org.springframework.beans.factory.config.BeanPostProcessor;  
  7.   
  8.   
  9. public class BeanPostProcessorImpl implements BeanPostProcessor {  
  10.   
  11. @Override  
  12.   
  13. public Object postProcessBeforeInitialization(Object bean, String beanName)  
  14.   
  15. throws BeansException {  
  16.   
  17. System.out.println("我把:" + beanName + "实例化化之前的操作");  
  18.   
  19. return bean;  
  20.   
  21. }  
  22.   
  23.   
  24. @Override  
  25.   
  26. public Object postProcessAfterInitialization(Object bean, String beanName)  
  27.   
  28. throws BeansException {  
  29.   
  30. System.out.println("我把:" + beanName + "实例化化之后的操作");  
  31.   
  32. return bean;  
  33.   
  34. }  
  35.   
  36.   
  37. }  
package www.csdn.spring.dao;


import org.springframework.beans.BeansException;

import org.springframework.beans.factory.config.BeanPostProcessor;


public class BeanPostProcessorImpl implements BeanPostProcessor {

@Override

public Object postProcessBeforeInitialization(Object bean, String beanName)

throws BeansException {

System.out.println("我把:" + beanName + "实例化化之前的操作");

return bean;

}


@Override

public Object postProcessAfterInitialization(Object bean, String beanName)

throws BeansException {

System.out.println("我把:" + beanName + "实例化化之后的操作");

return bean;

}


}

 

在配置文件中配置实体Bean和BeanPostProcessorImpl 特殊的Bean

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2.   
  3. <beans xmlns="http://www.springframework.org/schema/beans"  
  4.   
  5. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  6.   
  7. xsi:schemaLocation="http://www.springframework.org/schema/beans  
  8.   
  9.            http://www.springframework.org/schema/beans/spring-beans.xsd">  
  10.   
  11.   
  12.   
  13. <!-- spring容器 就是负责创建、管理、维护Bean 并且能够依赖注入到相应组件上 -->  
  14.   
  15. <bean id="helloDaoImpl" class="www.csdn.spring.dao.HelloDaoImpl"  
  16.   
  17. scope="singleton" lazy-init="false" init-method="init" destroy-method="close">  
  18.   
  19. <!-- 通过set方法注入 -->  
  20.   
  21. <property name="content" value="陈老师早上好!" />  
  22.   
  23. </bean>  
  24.   
  25.   
  26. <!-- BeanPostProcessor与当前的bean都进行关联 -->  
  27.   
  28. <bean class="www.csdn.spring.dao.BeanPostProcessorImpl" />  
  29.   
  30.   
  31. </beans>  
<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://www.springframework.org/schema/beans

           http://www.springframework.org/schema/beans/spring-beans.xsd">



<!-- spring容器 就是负责创建、管理、维护Bean 并且能够依赖注入到相应组件上 -->

<bean id="helloDaoImpl" class="www.csdn.spring.dao.HelloDaoImpl"

scope="singleton" lazy-init="false" init-method="init" destroy-method="close">

<!-- 通过set方法注入 -->

<property name="content" value="陈老师早上好!" />

</bean>


<!-- BeanPostProcessor与当前的bean都进行关联 -->

<bean class="www.csdn.spring.dao.BeanPostProcessorImpl" />


</beans>

 

创建测试类BeanTest 

  1. package www.csdn.spring.bean.cycle;  
  2.   
  3.   
  4. import org.junit.Test;  
  5.   
  6. import org.springframework.context.ApplicationContext;  
  7.   
  8. import org.springframework.context.ConfigurableApplicationContext;  
  9.   
  10. import org.springframework.context.support.ClassPathXmlApplicationContext;  
  11.   
  12.   
  13. public class BeanTest {  
  14.   
  15.   
  16. @Test  
  17.   
  18. public void test() {  
  19.   
  20. ApplicationContext context = new ClassPathXmlApplicationContext(  
  21.   
  22. "classpath:spring-dao.xml");  
  23.   
  24. // 强制造型   
  25.   
  26. ConfigurableApplicationContext cont = (ConfigurableApplicationContext) context;  
  27.   
  28. // 执行关闭 可以考到 destory-method的方法的执行   
  29.   
  30. cont.close();  
  31.   
  32.   
  33. }  
  34.   
  35. }  
package www.csdn.spring.bean.cycle;


import org.junit.Test;

import org.springframework.context.ApplicationContext;

import org.springframework.context.ConfigurableApplicationContext;

import org.springframework.context.support.ClassPathXmlApplicationContext;


public class BeanTest {


@Test

public void test() {

ApplicationContext context = new ClassPathXmlApplicationContext(

"classpath:spring-dao.xml");

// 强制造型

ConfigurableApplicationContext cont = (ConfigurableApplicationContext) context;

// 执行关闭 可以考到 destory-method的方法的执行

cont.close();


}

}

 

执行结果如下:

总结:在ApplicationContext中Bean的生命周期

2、在 BeanFactory中Bean的生命周期

     在BeanFactory中Bean的生命周期与ApplicationContext中bean的生命周期唯一不同的是:若bean实现了ApplicationContextAware()接口,在ApplicationContext中bean的生命周期中setApplicationContext()方法会被调用,而在BeanFactory中Bean的生命周期此方法不会被调用。

案例采用上个案例:测试类中测试代码如下:

  1. // 创建资源对象   
  2.   
  3. ClassPathResource resource = new ClassPathResource("spring-dao.xml");  
  4.   
  5. // 采用BeanFactory初始化容器   
  6.   
  7. ConfigurableBeanFactory cbf = new XmlBeanFactory(resource);  
  8.   
  9. // bean后置处理器必须通过addBeanPostProcessor(new BeanPostProcessorImpl())手动添加  
  10.   
  11. cbf.addBeanPostProcessor(new BeanPostProcessorImpl());  
  12.   
  13. //在配置文件中给BeanPostProcessorImpl的bean加上id="beanPostProcessorImpl" //cbf.addBeanPostProcessor(cbf.getBean("beanPostProcessorImpl", BeanPostProcessorImpl.class));  
  14.   
  15. // 获取Bean对象   
  16.   
  17. cbf.getBean("helloDaoImpl", HelloDaoImpl.class);  
  18.   
  19. // 销毁   
  20.   
  21. cbf.destroySingletons();  
// 创建资源对象

ClassPathResource resource = new ClassPathResource("spring-dao.xml");

// 采用BeanFactory初始化容器

ConfigurableBeanFactory cbf = new XmlBeanFactory(resource);

// bean后置处理器必须通过addBeanPostProcessor(new BeanPostProcessorImpl())手动添加

cbf.addBeanPostProcessor(new BeanPostProcessorImpl());

//在配置文件中给BeanPostProcessorImpl的bean加上id="beanPostProcessorImpl" //cbf.addBeanPostProcessor(cbf.getBean("beanPostProcessorImpl", BeanPostProcessorImpl.class));

// 获取Bean对象

cbf.getBean("helloDaoImpl", HelloDaoImpl.class);

// 销毁

cbf.destroySingletons();

 

执行结果:

总结:在BeanFactory中Bean的生命周期

另外说明:

     应用上下文与bean工厂的另一个重要区别是关于单例bean如何被加载。

bean工厂延迟加载所有bean,直到getBean()方法被调用。

应用上下文会在启动后预载入所有单例bean.这样可确保应用不需要等待他们被创建。

作者:chrp99 发表于2013-5-13 7:51:41 原文链接
阅读:2 评论:0 查看评论

相关 [spring bean 生命周期] 推荐:

Spring bean生命周期

- - 开源软件 - ITeye博客
Spring bean生命周期.       在传统的Java应用中,Bean的生命周期非常简单.  Java的关键词new用来实例化Bean(或许他是非序列化的).  相反,Bean的生命周期在Spring容器中更加细致.  理解Spring Bean的生命周期非常重要,因为你或许要利用Spring提供的机会来订制Bean的创建过程.

spring中Bean的生命周期总结

- - CSDN博客推荐文章
spring中在ApplicationContext或在BeanFactory中Bean的生命周期总结.  Spring中Bean的生命周期,在学习spring的过程中bean的生命周期理解对学习spring有很大的帮助,下面我就分别介绍在ApplicationContext和BeanFactory中Bean的生命周期.

Spring两种加载创建spring bean配置文件的方式

- - ITeye博客
基于spring做bean的管理,基于web开发时有两种加载配置文件创建bean的方式. 第一种基于DispatcherServlet的init-param:. 第二种基于ContextLoaderListener:. PS:如果两种方式都采用了那么spring容器中会维护两套bean,如果有调度,定时任务等那么会重复执行.

Java中如何获取Spring中配置的bean

- - CSDN博客推荐文章
Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架. 二、如何在程序中获取Spring配置的bean呢. 方法一:在初始化时保存ApplicationContext对象. 说明:这种方式适用于采用Spring框架的独立应用程序,需要程序通过配置文件手工初始化Spring的情况.

使用Java注解进行Spring bean管理

- - 编程语言 - ITeye博客
原文链接: http://www.ibm.com/developerworks/cn/webservices/ws-springjava/. 使用 Java 配置进行 Spring bean 管理. 学习使用 Java 配置管理 Spring bean. Spring bean 是使用传统的 XML 方法配置的.

Spring单例Bean和线程安全 - duanxz - 博客园

- -
Spring的bean默认都是单例的,这些单例Bean在多线程程序下如何保证线程安全呢. 例如对于Web应用来说,Web容器对于每个用户请求都创建一个单独的Sevlet线程来处理请求,引入Spring框架之后,每个Action都是单例的,那么对于Spring托管的单例Service Bean,如何保证其安全呢.

spring bean 不使用注入的方式获取的两种方式

- - 开源软件 - ITeye博客
非注入方式取得spring注入bean的util类实现. 第一种,我用在webservice接口中. * 通过spring配置文件中配置的bean id取得bean对象. * @param id spring bean ID值. * @return spring bean对象. 实现ApplicationContextAware的Bean,在Bean被初始后,将会被注入ApplicationContext的实例.

Activity生命周期详解

- - 编程语言 - ITeye博客
本文概述:针对一个例子详细阐述Activity的生命周期. Android是使用任务(Task)来管理活动的,一个任务就是一组存放在栈里的Activity的集合,这个栈也叫返回栈(Back Stack). 每次我们启动一个新的Activity,这个Activity就会入栈,并处于栈顶位置. 按下返回键或者finish()方法销毁一个Activity时,处于栈顶的Activity就会出栈,另一个Activity就会处于栈顶位置,显示给用户的就会是这个Activity..

敏捷应用生命周期管理

- - 博客 - 伯乐在线
Agile ALM使用敏捷的价值观和策略来充实了ALM,ALM的敏捷做法提升了产品的质量,缩短了上市时间,且有利于开发者以一种更加愉悦的心情来工作. 我对Agile ALM的定义可归结为,一些灵活的、对改变持开发态度的、高质量的过程和工具链. 敏捷应用生命周期管理(Agile Application Lifecycle Management,Agile ALM)正得到越来越大的推动,记得我在撰写“Agile ALM”一书的书稿时,几乎没有人会想到使用敏捷来丰富ALM的做法,或是找出一种有实效的ALM做法,越来越多的工具厂商发现,他们的工具在贴上敏捷工具甚至是敏捷ALM工具的标签之后好卖多了.

Activity的生命周期方法

- - 移动开发 - ITeye博客
一:Activity的生命周期方法.  Android提供了很多Activity的生命周期方法,比如我们常用的onCreate、onPause、onResume等. 这里主要介绍粗粒度的周期方法,诸如onPostCreate、onPostResume等. 这些细粒度的周期方法可以参考Android的API文档,在你需要更细层次的控制的时候可以使用这些细粒度的方法.