文章目录
  1. 1. BeanFactory
  2. 2. ApplicationContext
  3. 3. Bean 的作用范围
    1. 3.1. singleton作用域
    2. 3.2. prototype
    3. 3.3. request作用域
    4. 3.4. session作用域
    5. 3.5. globalSession作用域
  4. 4. 参考

在Spring框架中,一旦把一个bean纳入到Spring IoC容器之中,这个bean的生命周期就会交由容器进行管理,一般担当管理者角色的是BeanFactory或ApplicationContext。认识一下Bean的生命周期活动,对更好的利用它有很大的帮助。

概括来说主要有四个阶段:实例化,初始化,使用,销毁。

具体来说的话,Spring中存在几种SpringBean的容器:BeanFactory,ApplicationContext和WebApplicationContext。由于 ApplicationContext 和 webApplicationContext 基本一样。所有这里就只介绍 BeanFactory 和 ApplicationContext 。

BeanFactory

  1. 当调用者通过 getBean( name )向 容器寻找Bean 时,如果容器注册了org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor接口,在实例 bean 之前,将调用该接口的 postProcessBeforeInstantiation ()方法,
  2. 根据配置情况调用 Bean构造函数或工厂方法实例化 bean

  3. 如果容器注册了 org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor接口,在实例 bean 之后,调用该接口的 postProcessAfterInstantiation ()方法,可以在这里对已经实例化的对象进行一些装饰。

  4. 依赖注入,Spring 按照 Bean 定义信息配置 Bean 的所有属性 ,在设置每个属性之前将调用 InstantiationAwareBeanPostProcess接口的 postProcessPropertyValues ()方法 。

  5. 如果 Bean 实现了 BeanNameAware 接口,工厂调用 Bean 的 setBeanName() 方法传递 Bean 的 ID 。

  6. 如果 Bean 实现了 BeanFactoryAware 接口,工厂调用 setBeanFactory() 方法传入工厂自身。
  7. 如果 BeanPostProcessor 和 Bean 关联,那么将调用该接口的postProcessBeforeInitialzation() 方法 对 bean进行加工操作,这个非常重要, spring 的 AOP 就是用它实现的。
  8. 如果bean 实现了 InitializingBean 接口,将调用 afterPropertiesSet ()方法
  9. 如果Bean 指定了 init-method 方法,它将被调用。
  10. 如果有BeanPsotProcessor 和 Bean 关联,那么它们的 postProcessAfterInitialization() 方法将被调用。 到这个时候, Bean 已经可以被应用系统使用了 。
  11. 如果在 中指定了该 bean 的作用范围为 scope=”prototype”, 将 bean交给调用者,调用者管理该 bean 的生命周期, spring 不再管理该 bean 。
  12. 如果在 中指定了该 bean 的作用范围为 scope=”singleton”, 则将该 bean 放入 springIOC 的缓存池中,将触发 spring 对该 bean 的生命周期管理。

  13. 有两种方法可以把它从Bean Factory 中删除掉 :

    1. 如果 Bean 实现了 DisposableBean 接口, destory() 方法被调用。

    2. 如果指定了订制的销毁方法,就调用这个方法。

主要从三个方面理解:

  1. Bean自身的方法;
  2. Bean级生命周期接口方法;
  3. 容器级生命周期接口方法。

ApplicationContext

通过上图很容易发现其实应用上下文和BeanFactory 只是多了一个接口, 如果Bean 实现了 ApplicationContextAwre 接口, setApplicationContext() 方法被调用。
还有如果配置文件中声明了工厂后处理器接口 BeanFactoryPostProcessor的实现类,则应用上下文在装配配置文件之后初始化 bean 之前将调用该接口对配置信息进行加工。

Bean 的作用范围

scope是用来配置spring bean的作用域。spring2.0之前bean只有2种作用域即:singleton(单例)、non-singleton(也称prototype), Spring2.0以后,增加了session、request、global session三种专用于Web应用程序上下文的Bean。

singleton作用域

在默认情况下,spring的ApplicationContext容器在启动时,自动实例化所有singleton的Bean并缓存于容器中.虽然启动时会花费一些时间,但带来两个好处:首先对Bean提前的实例化操作会及早发现一些潜在的配置问题.其次Bean以缓存的方式保存,当运行时使用到该Bean时就无须再实例化了,加快了运行效率.如果用户不希望在容器启动时提前实例化singleton的Bean,可以通过lazy-init属性进行控制.

prototype

在默认情况下,spring容器在启动时不实例化prototype的Bean.此外,spring容器将prototype的Bean交给调用者后,就不再管理它的生命周期.

request作用域

每次HTTP请求都会创建一个新的Bean,HTTP请求处理完毕后,销毁这个Bean.该作用域仅适用于webApplicationContext环境.

session作用域

同一个HTTP session共享一个Bean,不同HTTP session使用不同的Bean,当HTTP Session结束后,实例才被销毁.该作用域仅适用于webApplicationContext环境

globalSession作用域

同一个全局session共享一个Bean,一般用于portlet应用环境,该作用域仅适用于webApplicationContext环境.

参考

  1. Spring IoC容器中Bean的作用范围详解
  2. springBean的生命周期
文章目录
  1. 1. BeanFactory
  2. 2. ApplicationContext
  3. 3. Bean 的作用范围
    1. 3.1. singleton作用域
    2. 3.2. prototype
    3. 3.3. request作用域
    4. 3.4. session作用域
    5. 3.5. globalSession作用域
  4. 4. 参考