Spring中Bean的生命周期

BeanFactory和ApplicationContext是Spring中两种很重要的容器,前者提供了最基本的依赖注入的支持,后者在继承前者的基础上进行了功能的拓展,增加了事件传播,资源访问,国际化的支持等功能。同时两者的生命周期也稍微有些不同。

BeanFactory中Bean的生命周期

  1. 容器寻找Bean的定义信息,并将其实例化。
  2. 使用依赖注入,Spring按照Bean定义信息配置Bean的所有属性。
  3. 如果Bean实现了BeanNameAware接口,工厂调用Bean的setBeanName()方法传递Bean的id。
  4. 如果实现了BeanFactoryAware接口,工厂调用setBeanFactory()方法传入工厂自身。
  5. 如果BeanPostProcessor和Bean关联,那么它们的postProcessBeforeInitialization()方法将被调用。(需要手动进行注册!)
  6. 如果Bean实现了InitializingBean接口,则会回调该接口的afterPropertiesSet()方法。
  7. 如果Bean指定了init-method方法,就会调用init-method方法。
  8. 如果BeanPostProcessor和Bean关联,那么它的postProcessAfterInitialization()方法将被调用。(需要手动注册!)
  9. 现在Bean已经可以使用了。
    1. scope为singleton的Bean缓存在Spring IOC容器中。
    2. scope为prototype的Bean生命周期交给客户端。
  10. 销毁。
  11. 如果Bean实现了DisposableBean接口,destory()方法将会被调用。
  12. 如果配置了destory-method方法,就调用这个方法。

ApplicationContext中Bean的生命周期

  1. 容器寻找Bean的定义信息,并将其实例化。会对scope为singleton且非懒加载的bean进行实例化
  2. 使用依赖注入,Spring按照Bean定义信息配置Bean的所有属性。
  3. 如果Bean实现了BeanNameAware接口,工厂调用Bean的setBeanName()方法传递Bean的id。
  4. 如果实现了BeanFactoryAware接口,工厂调用setBeanFactory()方法传入工厂自身。
  5. 如果实现了ApplicationContextAware接口,会调用该接口的setApplicationContext()方法,传入该Bean的ApplicationContext,这样该Bean就获得了自己所在的ApplicationContext。
  6. 如果Bean实现了BeanPostProcessor接口,则调用postProcessBeforeInitialization()方法。
  7. 如果Bean实现了InitializingBean接口,则会回调该接口的afterPropertiesSet()方法。
  8. 如果Bean制定了init-method方法,就会调用init-method方法。
  9. 如果Bean实现了BeanPostProcessor接口,则调用postProcessAfterInitialization()方法。
  10. 现在Bean已经可以使用了。
    1. scope为singleton的Bean缓存在Spring IOC容器中。
    2. scope为prototype的Bean生命周期交给客户端。
  11. 销毁。
    1. 如果Bean实现了DisposableBean接口,destory()方法将会被调用。
    2. 如果配置了destory-method方法,就调用这个方法。

两种容器中的不同之处

  1. BeanFactory容器中不会调用ApplicationContext接口的setApplicationContext()方法。
  2. BeanFactory中BeanPostProcessor接口的postProcessBeforeInitialzation()方法和postProcessAfterInitialization()方法不会自动调用,必须自己通过代码手动注册。
  3. BeanFactory容器启动的时候,不会去实例化所有Bean,包括所有scope为singleton且非懒加载的Bean也是一样,而是在调用的时候去实例化。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring中的Bean对象通过继承一系列接口,以及在ApplicationContext.xml文件中配置,可以...
    雁归来兮阅读 590评论 0 3
  • 什么是Spring Spring是一个开源的Java EE开发框架。Spring框架的核心功能可以应用在任何Jav...
    jemmm阅读 16,574评论 1 133
  • 1- IOC的概念 IOC:也即控制反转,DI即依赖注入,控制反转IOC和依赖注入DI其实就是同个概念的两个不同...
    zhanglbjames阅读 3,045评论 1 3
  • CAP分布式理论 2002年CAP理论正式成为分布式计算领域的公认定理 CAP指一致性(Consisitency)...
    frmark阅读 669评论 0 0
  • 早上好,清醒的一天,耳边听着优美的英文歌曲,很喜欢never say never。这周开始尝试自己的学习计划,即是...
    小马克Wel阅读 178评论 0 0