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

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

4
    public void init() {
5
        System.out.println("Coder init");
6
    }
7

8
    public void destroy() {
9
        System.out.println("Coder destory");
10
    }
11

12
}
public static void main(String[] args) {
ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("/applicationContext.xml");
Coder coder = (Coder) ac.getBean("coder");
ac.close();
}
 
1
public static void main(String[] args) {
2
    ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("/applicationContext.xml");
3
    Coder coder = (Coder) ac.getBean("coder");
4
    ac.close();
5
}
 


[05] Bean的作用域和生命周期的更多相关文章

  1. Spring中Bean的作用域、生命周期

                                   Bean的作用域.生命周期 Bean的作用域 Spring 3中为Bean定义了5中作用域,分别为singleton(单例).protot ...

  2. Spring之Bean的作用域与生命周期

    在前面博客中提到容器启动获得BeanDefinition对象中有一个scope 属性.该属性控制着bean对象的作用域.本章节介绍Bean的作用域及生命周期,了解bean是怎么来的又怎么没的. 一.B ...

  3. 详解Spring中Bean的作用域与生命周期

    摘要:在利用Spring进行IOC配置时,关于bean的配置和使用一直都是比较重要的一部分,同时如何合理的使用和创建bean对象,也是小伙伴们在学习和使用Spring时需要注意的部分,所以这一篇文章我 ...

  4. Spring bean的作用域和生命周期

    bean的作用域 1.singleton,prototype, web环境下:request,session,gloab session 2.通过scope="" 来进行配置 3. ...

  5. Spring中bean的作用域与生命周期

    在 Spring 中,那些组成应用程序的主体及由 Spring IOC 容器所管理的对象,被称之为 bean.简单地讲,bean 就是由 IOC 容器初始化.装配及管理的对象,除此之外,bean 就与 ...

  6. Spring框架系列(三)--Bean的作用域和生命周期

    Bean的作用域 Spring应用中,对象实例都是在Container中,负责创建.装配.配置和管理生命周期(new到finalize()) Spring Container分为两种: 1.BeanF ...

  7. Spring bean的作用域以及生命周期

    一.request与session的区别 request简介 request范围较小一些,只是一个请求. request对象的生命周期是针对一个客户端(说确切点就是一个浏览器应用程序)的一次请求,当请 ...

  8. Spring中Bean的作用域和生命周期

    作用域的种类 Spring 容器在初始化一个 Bean 的实例时,同时会指定该实例的作用域.Spring3 为 Bean 定义了五种作用域,具体如下. 1)singleton 单例模式,使用 sing ...

  9. bean的作用域和生命周期

    一.Bean作用域 二.生命周期 其中,这个类实现各种接口重写各种方法,会按bean的声明周期按序执行: 其中,自定义的初始化和自定义销毁的方法不是实现接口重写,而是成员方法,并且在装配bean即在x ...

随机推荐

  1. CentOS 通过yum来升级php到php5.6,yum upgrade php 没有更新包

    在文章中,我们将展示在centOS系统下如何将php升级到5.6,之前通过yum来安装lamp环境,直接升级的话,提示没有更新包,也就是说默认情况下php5.3.3是最新 1.查看已经安装的php版本 ...

  2. JavaWeb:jsp

    本文内容: JSP的介绍 jsp的使用 EL表达式 JSTL的使用 首发日期:2018-06-18 JSP的介绍: JSP全称Java Server Pages. 与静态网页格式的html不同的是,j ...

  3. Python:GUI之tkinter学习笔记3事件绑定

    相关内容: command bind protocol 首发时间:2018-03-04 19:26 command: command是控件中的一个参数,如果使得command=函数,那么点击控件的时候 ...

  4. 简单整理关于C#和Java的区别

    相信每个程序猿都有自己最喜欢的编程语言,然而对于编程语言似乎形成一条独特的鄙视链,就如Java和C#常常两边的开发者都是相互鄙视,然后他们一起共同鄙视全世界最好的编程语言——PHP 哈哈,但是其实我想 ...

  5. jQuery选择元素的方法大全

    jQuery选择器其实是一个有些地方比较费解的,如果没有经过多次实验的话,很难得出它的每个操作符到底是干什么的,很容易出错,经过 我的多次测试,终于对一些比较难理解或容易出错的选择操作进行总结,既方便 ...

  6. sqlserver 拆分

    有表tb, 如下:id value----------- -----------1 aa,bb2 aaa,bbb,ccc欲按id,分拆value列, 分拆后结果如下:id value--------- ...

  7. QSetting的值不能保存。

    最近在使用QSetting的时候,setting的值死活保存不下来,后来添加了如何设置后,settting的可以获取到. QCoreApplication::setOrganizationName(& ...

  8. nginx1.14的安装

    编译安装nginx1.14.2 #拷贝指定文件到当前目录下[root@localhost ~]# find /usr/share -iname "*.jpg" -exec cp { ...

  9. PHP APP端微信支付

    前面已经写了手机APP支付宝支付,今天再把手机APP微信支付补上,前期的准备工作在这里就不多说了,可以参考微信支付开发文档,一定要仔细阅读开发文档,可以让你少踩点坑:准备工作完成后就是配置参数,调用统 ...

  10. 使用Maven分环境打包:dev sit uat prod

    使用Maven管理的项目,经常需要根据不同的环境打不同的包,因为环境不同,所需要的配置文件不同,比如database的连接信息,相关属性等等. 在Maven中,我们可以通过P参数和profiles元素 ...