Spring 是如何管理Bean的 - Gukie/interview GitHub Wiki

refer:


  1. 启动的时候,实例化所有的bean,当然这些bean是 singleton的

  2. 实例化的时候,可以根据是否配置了 init-method 或者实现了 InitializingBean 做一些初始化的操作 何时被实例化: 被调用的时候,或者启动的时候,就要看bean的scope是什么了

  3. 使用bean的过程,即依赖注入

  4. 销毁,这个也可根据 是否配置了 destory-method 或者 实现了 DisposableBean 做一些销毁的操作

注意:scope为prototype的bean,容器会将创建好的对象实例返回给请求方,之后,容器就不再拥有其引用,请求方需要自己负责当前对象后继生命周期的管理工作,包括该对象的销毁。 所以:scope为singleton的bean的destroy方法则是在容器关闭时执行,而scope为prototype的bean是不会执行destroy方法的。

整个生命周期如下:


实例化bean的方式:

  1. 构造函数
<bean id=“orderService" class="cn.itcast.OrderServiceBean"/>
  1. 静态工厂方法
<bean id="personService" class="cn.itcast.service.OrderFactory" factory-method="createOrder"/>
public class OrderFactory {
    public static OrderServiceBean createOrder(){   // 注意这里的这个方法是 static 的!
        return new OrderServiceBean();
    }
}
  1. 实例工厂方法
<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

  1. singleton: 整个IOC容器中,只有一份。何时被实例化,就看 lazy-init的属性的配置
  2. prototype: 每调用一次,都会实例化一个对象出来

对于prototype作用域的bean,有一点非常重要,那就是Spring不能对一个prototype bean的整个生命周期负责:容器在初始化、配置、装饰或者是 装配完一个prototype实例后,将它交给客户端,随后就对该prototype实例不闻不问了。不管何种作用域,容器都会调用所有对象的初始化生命周期回调方法。

但对prototype而言,任何配置好的析构生命周期回调方法都将不会被调用。清除prototype作用域的对象并释放任何prototype bean所持有的昂贵资源,都是客户端代码的职责。(让Spring容器释放被prototype作用域bean占用资源的一种可行方式是,通过使用bean的后置处理器,该处理器持有要被清除的bean的引用。)

  1. request: web 才有的,一个HTTP Request,
  2. session: Web才有的
  3. global session,

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