`
阿尔萨斯
  • 浏览: 4169025 次
社区版块
存档分类
最新评论

spring生命周期

 
阅读更多

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

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

1、在ApplicationContextBean的生命周期

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

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. packagewww.csdn.spring.dao;
  2. importorg.springframework.beans.BeansException;
  3. importorg.springframework.beans.factory.BeanFactory;
  4. importorg.springframework.beans.factory.BeanFactoryAware;
  5. importorg.springframework.beans.factory.BeanNameAware;
  6. importorg.springframework.beans.factory.DisposableBean;
  7. importorg.springframework.beans.factory.InitializingBean;
  8. importorg.springframework.context.ApplicationContext;
  9. importorg.springframework.context.ApplicationContextAware;
  10. publicclassHelloDaoImplimplementsBeanNameAware,BeanFactoryAware,
  11. InitializingBean,ApplicationContextAware,DisposableBean{
  12. privateStringcontent;
  13. publicHelloDaoImpl(){
  14. System.out.println("----------HelloDaoImpl实例化");
  15. }
  16. publicvoidsetContent(Stringcontent){
  17. System.out.println("----------通过依赖注入的内容是:"+content);
  18. this.content=content;
  19. }
  20. @Override
  21. publicvoidsetBeanName(StringbeanId){
  22. System.out.println("----------输出BeanId:"+beanId);
  23. }
  24. @Override
  25. publicvoidsetBeanFactory(BeanFactoryfactory)throwsBeansException{
  26. System.out.println("----------factory:"+factory.getClass());
  27. }
  28. @Override
  29. publicvoidsetApplicationContext(ApplicationContextapplicationContext)
  30. throwsBeansException{
  31. System.out.println("----------"+applicationContext);
  32. }
  33. @Override
  34. publicvoidafterPropertiesSet()throwsException{
  35. System.out.println("----------afterPropertiesSet");
  36. }
  37. publicvoidinit(){
  38. System.out.println("----------初始化方法");
  39. }
  40. @Override
  41. publicvoiddestroy()throwsException{
  42. System.out.println("----------bean被销毁");
  43. }
  44. publicvoidclose(){
  45. System.out.println("----------close");
  46. }
  47. }

创建BeanPostProcessor实现类

  1. packagewww.csdn.spring.dao;
  2. importorg.springframework.beans.BeansException;
  3. importorg.springframework.beans.factory.config.BeanPostProcessor;
  4. publicclassBeanPostProcessorImplimplementsBeanPostProcessor{
  5. @Override
  6. publicObjectpostProcessBeforeInitialization(Objectbean,StringbeanName)
  7. throwsBeansException{
  8. System.out.println("我把:"+beanName+"实例化化之前的操作");
  9. returnbean;
  10. }
  11. @Override
  12. publicObjectpostProcessAfterInitialization(Objectbean,StringbeanName)
  13. throwsBeansException{
  14. System.out.println("我把:"+beanName+"实例化化之后的操作");
  15. returnbean;
  16. }
  17. }

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

  1. <?xmlversion="1.0"encoding="UTF-8"?>
  2. <beansxmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans
  5. http://www.springframework.org/schema/beans/spring-beans.xsd">
  6. <!--spring容器就是负责创建、管理、维护Bean并且能够依赖注入到相应组件上-->
  7. <beanid="helloDaoImpl"class="www.csdn.spring.dao.HelloDaoImpl"
  8. scope="singleton"lazy-init="false"init-method="init"destroy-method="close">
  9. <!--通过set方法注入-->
  10. <propertyname="content"value="陈老师早上好!"/>
  11. </bean>
  12. <!--BeanPostProcessor与当前的bean都进行关联-->
  13. <beanclass="www.csdn.spring.dao.BeanPostProcessorImpl"/>
  14. </beans>

创建测试类BeanTest

  1. packagewww.csdn.spring.bean.cycle;
  2. importorg.junit.Test;
  3. importorg.springframework.context.ApplicationContext;
  4. importorg.springframework.context.ConfigurableApplicationContext;
  5. importorg.springframework.context.support.ClassPathXmlApplicationContext;
  6. publicclassBeanTest{
  7. @Test
  8. publicvoidtest(){
  9. ApplicationContextcontext=newClassPathXmlApplicationContext(
  10. "classpath:spring-dao.xml");
  11. //强制造型
  12. ConfigurableApplicationContextcont=(ConfigurableApplicationContext)context;
  13. //执行关闭可以考到destory-method的方法的执行
  14. cont.close();
  15. }
  16. }

执行结果如下:

总结:在ApplicationContextBean的生命周期

2、在BeanFactoryBean的生命周期

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

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

  1. //创建资源对象
  2. ClassPathResourceresource=newClassPathResource("spring-dao.xml");
  3. //采用BeanFactory初始化容器
  4. ConfigurableBeanFactorycbf=newXmlBeanFactory(resource);
  5. //bean后置处理器必须通过addBeanPostProcessor(newBeanPostProcessorImpl())手动添加
  6. cbf.addBeanPostProcessor(newBeanPostProcessorImpl());
  7. //在配置文件中给BeanPostProcessorImpl的bean加上id="beanPostProcessorImpl"//cbf.addBeanPostProcessor(cbf.getBean("beanPostProcessorImpl",BeanPostProcessorImpl.class));
  8. //获取Bean对象
  9. cbf.getBean("helloDaoImpl",HelloDaoImpl.class);
  10. //销毁
  11. cbf.destroySingletons();

执行结果:

总结:在BeanFactoryBean的生命周期

另外说明:

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

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

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

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics