Spring 是如何管理Bean的 - Gukie/interview GitHub Wiki
refer:
- https://my.oschina.net/itblog/blog/205816
- http://www.cnblogs.com/yinger/archive/2011/08/23/2150626.html
- http://www.cnblogs.com/larryzeal/p/5520665.html
-
启动的时候,实例化所有的bean,当然这些bean是 singleton的
-
实例化的时候,可以根据是否配置了 init-method 或者实现了 InitializingBean 做一些初始化后的操作 何时被实例化: 被调用的时候,或者启动的时候,就要看bean的scope是什么了
-
使用bean的过程,即依赖注入
-
销毁,这个也可根据 是否配置了 destory-method 或者 实现了 DisposableBean 做一些销毁前的操作
注意:scope为prototype的bean,容器会将创建好的对象实例返回给请求方,之后,容器就不再拥有其引用,请求方需要自己负责当前对象后继生命周期的管理工作,包括该对象的销毁。 所以:scope为singleton的bean的destroy方法则是在容器关闭时执行,而scope为prototype的bean是不会执行destroy方法的。
整个生命周期如下:

实例化bean的方式:
- 构造函数
<bean id=“orderService" class="cn.itcast.OrderServiceBean"/>
- 静态工厂方法
<bean id="personService" class="cn.itcast.service.OrderFactory" factory-method="createOrder"/>
public class OrderFactory {
public static OrderServiceBean createOrder(){ // 注意这里的这个方法是 static 的!
return new OrderServiceBean();
}
}
- 实例工厂方法
<bean id="personServiceFactory" class="cn.itcast.service.OrderFactory"/>
<bean id="personService" factory-bean="personServiceFactory" factory-method="createOrder"/>
public class OrderFactory {
public OrderServiceBean createOrder(){
return new OrderServiceBean();
}
}
Bean的Scope
- singleton: 整个IOC容器中,只有一份。何时被实例化,就看 lazy-init的属性的配置
- prototype: 每调用一次,都会实例化一个对象出来
对于prototype作用域的bean,有一点非常重要,那就是Spring不能对一个prototype bean的整个生命周期负责:容器在初始化、配置、装饰或者是 装配完一个prototype实例后,将它交给客户端,随后就对该prototype实例不闻不问了。不管何种作用域,容器都会调用所有对象的初始化生命周期回调方法。
但对prototype而言,任何配置好的析构生命周期回调方法都将不会被调用。清除prototype作用域的对象并释放任何prototype bean所持有的昂贵资源,都是客户端代码的职责。(让Spring容器释放被prototype作用域bean占用资源的一种可行方式是,通过使用bean的后置处理器,该处理器持有要被清除的bean的引用。)
- request: web 才有的,一个HTTP Request,
- session: Web才有的
- global session,

RequestContextListener和RequestContextFilter两个类做的都是同样的工作: 将HTTP request对象绑定到为该请求提供服务的Thread。 这使得具有request和session作用域的bean能够在后面的调用链中被访问到。