zoukankan      html  css  js  c++  java
  • [05] Bean的作用域和生命周期


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

    之前我们稍微提到过,Spring中管理的Bean,默认都是单例模式,这意味着你多次获取某个对象,得到的都是相同的对象。单例作用域的显性写法是scope属性,如下,这和你不写scope效果是一样的:
    <bean id="coder" class="dulk.learn.spring.Coder" scope="singleton" lazy-init="true"></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 id="Coder" init-method="init" destroy-method="destroy" class="dulk.learn.spring.Coder"></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();
    }
     


  • 相关阅读:
    从B树、B+树、B*树谈到R 树
    平衡二叉树、B树、B+树、B*树
    数据库事务和四种隔离级别
    python 安装surprise库解决 c++tools错误问题
    python的sorted函数
    爬虫出现gbk错误
    Windows下Python安装numpy+mkl,Scipy和statsmodels
    Flask--框架及路由
    flask常见面试题
    RE正则表达式
  • 原文地址:https://www.cnblogs.com/deng-cc/p/8877953.html
Copyright © 2011-2022 走看看