SpringBean 的作用域以及生命周期

Spring中bean的作用域:

SpringBean 的作用域以及生命周期
五种作用域中,request、session和global session三种作用域仅在基于web的应用中使用(不必关心你所采用的是什么web应用框架),只能用在基于web的Spring ApplicationContext环境。
详见Spring中bean的生命周期和作用域前半部分

Spring实例化的过程:

SpringBean 的作用域以及生命周期

Spring中Bean的生命周期:

一个bean纳入到Spring IOC容器中,这个Bean的生命周期就交给了Spring容器,一般的管理者角色是BeanFactory或者ApplicationContext

SpringBean 的作用域以及生命周期
文字详解 如下:
首先 Servlet的生命周期:实例化,初始化init,接收请求service,销毁destroy。
SpringContext中的bean也是如此:
1.实例化一个bean,new;

2.IOC注入 :按照Spring的上下文对实例化的Bean进行配置;

3.检查Bean实现的接口:
a。bean实现了BeanNameAware接口,就会调用它实现的setBeanName(String)方法,此处传递的就是Spring配置文件中Bean的id值;
b。如果实现了BeanFactoryAware接口,会调用setBeanFactory(BeanFactory)方法,传递的是Spring工厂自身(所以可用该方式获取其他在Spring配置文件中已经配好的其他的Bean)
c。如果这个Bean已经实现了ApplicationContextAware接口,会调用setApplicationContext(ApplicationContext)方法,传入Spring上下文(同样这个方式也可以实现步骤4的内容,但比4更好,因为ApplicationContext是BeanFactory的子接口,有更多的实现方法);
d。如果这个Bean关联了BeanPostProcessor接口,将会调用postProcessBeforeInitialization(Object obj, String s)方法,BeanPostProcessor经常被用作是Bean内容的更改,并且由于这个是在Bean初始化结束时调用那个的方法,也可以被应用于内存或缓存技术;

4.init-method属性(在Spring配置文件中配置)会自动调用其配置的初始化方法;

5.如果这个Bean关联了BeanPostProcessor接口,将会调用postProcessAfterInitialization(Object obj, String s)方法、;

注:以上工作完成以后就可以应用这个Bean了,那这个Bean是一个Singleton的,所以一般情况下我们调用同一个id的Bean会是在内容地址相同的实例,当然在Spring配置文件中也可以配置非Singleton,这里我们不做赘述。

6、当Bean不再需要时,会经过清理阶段,如果Bean实现了DisposableBean这个接口,会调用那个其实现的destroy()方法;

7、最后,如果这个Bean的Spring配置中配置了destroy-method属性,会自动调用其配置的销毁方法。

一般来言,Springbean的生命周期从Spring容器开始创建一直到bean被Spring容器消除。
期间经历了一些bean被创建的过程:
SpringBean 的作用域以及生命周期