无风无影

   ::  :: 新随笔  ::  ::  :: 管理

Spring Bean的生命周期

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

  在大多数情况下。单例 bean 是很理想的方案。不过,有时候你可能会发现你所使用的类是易变的,它们会保持一些状态,因此重用是不安全的。在这种情况下,将 class 声明为单例的就不是那么明智了。因为对象会被污染,稍后重用的时候会出现意想不到的问题。所以 Spring 定义了多种作用域的bean。

 步骤描述:

1、Spring对Bean进行实例化

2、Spring将值和Bean引用注入到Bean对应的属性中

3、如果Bean实现了BeanNameAware接口,Sping将bena的ID传递给setBeanName(String beanId)方法,传递的是Spring配置文件中Bean的ID

4. 如果Bean实现了BeanFactoryAware接口,spring将调用setBeanFactory(),将BeanFactory实例传入,及传递工厂

5、如果Bean实现了ApplicationContextAware接口,spring将调用setApplicationContext(ApplicationContext)方法,将bean所在的上下文引用传入进来。(该方式同样可以实现步骤4,但比4更好,以为ApplicationContext是BeanFactory的子接口,有更多的实现方法

6、如果Bea实现了BeanPostProcessor接口,将会调用postProcessBeforeInitialization(Object obj, String s)方法(BeanPostProcessor经常被用作是Bean内容的更改,并且由于这个是在Bean初始化结束时调用After方法,也可用于内存或缓存技术

7、如果Bean实现了InitializingBean接口,Spring将调用他的afterPropertiesSet()方法,类似的,如果Bean实现了init-method生命了初始化方法,该方法他也会会被调用

8、如果Bean实现了BeanPostProcessor接口,将会调用postAfterInitialization(Object obj, String s)方法

9、此时Bean已经准备给就绪,可以被应用程序使用了,他们将一直驻留在应用上下文中,直到该应用上下文被销毁。

10、当Bean不再需要时,会经过清理阶段,如果Bean实现了DisposableBean接口,会调用其实现的destroy方法。如果这个Bean的Spring配置中配置了destroy-method属性,该方法也会被调用。

 

#作用域

                

singleton

  当一个bean的作用域为singleton, 那么Spring IoC容器中只会存在一个共享的bean实例,并且所有对bean的请求,只要id与该bean定义相匹配,则只会返回bean的同一实例。

prototype

  Prototype作用域的bean会导致在每次对该bean请求(将其注入到另一个bean中,或者以程序的方式调用容器的getBean() 方法)时都会创建一个新的bean实例。根据经验,对所有有状态的bean应该使用prototype作用域,而对无状态的bean则应该使用 singleton作用域

request

  在一次HTTP请求中,一个bean定义对应一个实例;即每次HTTP请求将会有各自的bean实例, 它们依据某个bean定义创建而成。该作用 域仅在基于web的Spring ApplicationContext情形下有效。

session

  在一个HTTP Session中,一个bean定义对应一个实例。该作用域仅在基于web的Spring ApplicationContext情形下有效。

global session

  在一个全局的HTTP Session中,一个bean定义对应一个实例。典型情况下,仅在使用portlet context的时候有效。该作用域仅在基于 web的Spring ApplicationContext情形下有效。

 

  参考链接:https://github.com/Snailclimb/JavaGuide/blob/master/docs/system-design/framework/spring/SpringBean.md

posted on 2018-06-04 22:42  NWNS-无风无影  阅读(151)  评论(0)    收藏  举报