Spring 中bean 的生命周期短暂吗?

  spring 中,从 BeanFactory ApplicationContext 取得的实例为 Singleton ,也就是预设为每一个 Bean 的别名只能维持一个实例,而不是每次都产生一个新的对象使用 Singleton 模式产生单一实例,对单线程的程序说并不会有什么问题,但对于多线程的程序,就必须注意安全 (Thread-safe) 的议题,防止多个线程
同时存取共享资源所引发的数据不同步问题。
然而在spring 中 可以设定每次从 BeanFactory ApplicationContext 指定别名并取得 Bean 时都产生一个新的实例:例如:
<bean id=" studentService " class=" cn.csdn.service.StudentSrvice " singleton="false">
spring 中, singleton 属性默认是 true ,只有设定为 false ,则每次指定别名取得的 Bean 时都会产生一个新的实例

一个Bean 从创建到销毁,如果是用 BeanFactory 来生成 , 管理 Bean 的话,会经历几个执行阶段 (如图 1.1

      Spring 中bean 的生命周期短暂吗?
    1 Bean 的建立:

      容器寻找Bean 的定义信息并将其实例化。  

   2:属性注入:
           使用依赖注入, Spring按照 Bean 定义信息配置 Bean 所有属性
    3 BeanNameAware setBeanName()
          如果Bean 类有实现 org.springframework.beans.BeanNameAware 接口, 工厂调用 Bean setBeanName() 方法传递 Bean ID

   4 BeanFactoryAware setBeanFactory()
          如果Bean 类有实现 org.springframework.beans.factory.BeanFactoryAware 接口, 工厂调用 setBeanFactory()方法传入工厂自身。
     5 BeanPostProcessors ProcessBeforeInitialization()
          如果 org.springframework.beans.factory.config.BeanPostProcessors Bean 关联,那么其 postP rocessBeforeInitialization()方法 将被将被调用。
    6 initializingBean afterPropertiesSet()
          如果Bean 类已实现 org.springframework.beans.factory.InitializingBean 接口,则执行他的 afterProPertiesSet() 方法
    7 Bean 定义文件中定义 init-method
          可以在Bean 定义文件中使用 "init-method" 属性设定方法名称例如:
          <bean id=" studentService " calss=" cn.csdn.service.StudentService " init-method="init">
          如果有以上设置的话,则执行到这个阶段,就会执行initBean() 方法
    8 BeanPostProcessors ProcessaAfterInitialization()
          如果有任何的BeanPostProcessors 实例与 Bean 实例关联,则执行 BeanPostProcessors 实例的 ProcessaAfterInitialization() 方法

此时, Bean已经可以被应用系统使用,并且将保留在 BeanFactory 中知道它不在被使用。有两种方法可以将其从 BeanFactory 中删除掉(如图 1.2):

   Spring 中bean 的生命周期短暂吗?
     1 DisposableBean destroy()
          在容器关闭时,如果Bean 类有实现 org.springframework.beans.factory.DisposableBean 接口,则执行他的 destroy() 方法
     2 Bean 定义文件中定义 destroy-method
          在容器关闭时,可以在Bean 定义文件中使用 "destroy-method" 属性设定方法名称,例如:
  <bean id=" studentService " calss=" cn.csdn.service.StudentService "destroy-method="destroy">
          如果有以上设定的话,则进行至这个阶段时,就会执行destroy() 方法,如果是使用 ApplicationContext 来生成并管理 Bean 的话则稍有不同,使用 ApplicationContext 来生成及管理 Bean 实例的话,在执行 BeanFactoryAware setBeanFactory() 阶段后,若 Bean 类上有实现 org.springframework.context.ApplicationContextAware 接口,则执行其 setApplicationContext() 方法,接着才执行 BeanPostProcessors ProcessBeforeInitialization() 及之后的流程

 

<!--EndFragment-->

你可能感兴趣的:(spring,thread,多线程,bean,配置管理)