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. sql server:Monty Hall problem (蒙提霍尔问题)

    --------------------------------------------------------------------- -- Auxiliry Table of Numbers 数 ...

  2. 安卓开发_深入理解Handler消息传递机制

    一.概述 因为子线程的run()方法无法修改UI线程(主线程)的UI界面,所以Android引入了Handler消息传递机制,实现在新创建的线程中操作UI界面 二.消息类(Message) 消息类是存 ...

  3. Ubuntu18.04 安装mysql8.0.11

    1.下载deb包 2.运行命令 sudo dpkg -i mysql-apt-config_0.8.10-1_all.deb sudo apt update 3.安装mysql8 sudo apt i ...

  4. 利用python实现简单词频统计、构建词云

    1.利用jieba分词,排除停用词stopword之后,对文章中的词进行词频统计,并用matplotlib进行直方图展示 # coding: utf-8 import codecs import ma ...

  5. 针对模拟滚动条插件(jQuery.slimscroll.js)的修改

    在开发过程中程序员总会碰到产品经理提出的各种稀奇古怪的需求,尽管有些需求很奇葩,但不得不说有些须有还是能指引我们不断的学习与进步,最近在工作中就碰到这种问题.需求是要求在各主流浏览器上使用自定义的滚动 ...

  6. charles系列破解激活办法(最高charles4.2都可以激活)

    // Charles Proxy License // 适用于Charles任意版本的注册码,谁还会想要使用破解版呢. // Charles 4.2目前是最新版,可用.   Registered Na ...

  7. 利用Spring的AbstractRoutingDataSource解决多数据源的问题

    多数据源问题很常见,例如读写分离数据库配置. 原来的项目出现了新需求,局方要求新增某服务器用以提供某代码,涉及到多数据源的问题. 解决方法如下: 1.首先配置多个datasource <bean ...

  8. Kubernetes 核心概念

    什么是Kubernetes? Kubernetes(k8s)是自动化容器操作的开源平台,这些操作包括部署,调度和节点集群间扩展.如果你曾经用过Docker容器技术部署容器,那么可以将Docker看成K ...

  9. CyclicBarrier源码解读

    1. 简介 JUC中的CyclicBarrier提供了一种多线程间的同步机制,可以让多个线程在barrier等待其它线程到达barrier.正如其名CyclicBarrier含义就是可以循环使用的屏障 ...

  10. Django Form ModelForm modelfromset

    forms 组件 Form 组件 form表单完成的事情 提供input可以提交数据 对提交的数据进行校验 提供错误提示 定义form组件 from django import forms class ...