1、Bean的作用域和初始化时间

之前我们稍微提到过,Spring中管理的Bean,默认都是单例模式,这意味着你多次获取某个对象,得到的都是相同的对象。单例作用域的显性写法是scope属性,如下,这和你不写scope效果是一样的:
<bean ></bean> 

既然说到了单例模式,还有scope属性,那么显而易见,也就还有其他的作用域:
类别     说明    
singleton     在Spring IOC 容器中仅存在一个Bean实例,Bean以单例的形式存在
prototype 每次从容器中调用Bean时,都返回新的实例,即每次调用getBean()时,相当于执行new XxxBean()的操作
request     每次HTTP请求都会创建一个新的Bean
(该作用域仅适用于WebApplicationContext环境)    
session     同一个HTTP Session共享一个Bean,不同HTTP Session使用不同的Bean
该作用域仅适用于WebApplicationContext环境
globalSession 同一个全局Session共享一个Bean,一般用于Portlet应用环境
该作用域仅适用于WebApplicationContext环境

插个题外话,看到这里应该能联想到了,我们常用的SSH三大框架组合,其中Struts的Action交给Spring作Bean管理,那么Action是哪种模式呢?默认是单例,意味着数据共享,这在多请求访问时显然是不合时宜的,所以常常配置的还是prototype。

而对于Bean的初始化,那么涉及到另一个属性,叫做“lazy-init”(懒加载),该标签在scope=singleton时影响Bean的实例化时间
  • true:当第一次获取对象实例时创建对象
  • false:当容器加载时就创建对象
  • 默认default相当于false

2、Bean初始化和销毁方法

Spring在创建Bean实例后,会调用Bean配置的初始化方法。而在Spring容器关闭后,Bean不被容器调用,进入可垃圾回收阶段,那么在容器关闭之前,会调用Bean配置的销毁方法(只有scope=singleton的Bean才会执行销毁方法,如果是prototype,对象实例化后已经脱离了Spring的管理转交给调用者,Spring无法获取也就无谈销毁了)

在配置文件里,使用“init-method”和“destroy-method”属性,属性值为Bean的方法名称,如下:
<bean ></bean>
public class Coder {
    ...

    public void init() {
        System.out.println("Coder init");
    }

    public void destroy() {
        System.out.println("Coder destory");
    }

}
public static void main(String[] args) {
    ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("/applicationContext.xml");
    Coder coder = (Coder) ac.getBean("coder");
    ac.close();
}
[05] Bean的作用域和生命周期
 


相关文章: