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
浙公网安备 33010602011771号