链接:https://pan.baidu.com/s/1wgxnXnGbPdK1YaZvhO7PDQ
提取码:opjr

单例模式:每个bean定义只生成一个对象实例,每次getBean请求获得的都是此实例

单例模式分为饿汉模式和懒汉模式

饿汉模式:spring singleton的缺省是饿汉模式:启动容器时(即实例化容器时),为所有spring配置文件中定义的bean都生成一个实例

懒汉模式:在第一个请求时才生成一个实例,以后的请求都调用这个实例

在网上有许多这样的概念,你也一定烦了吧,我们用代码来看清楚这个过程

为了展示过程,我们需要引入log4j的jar包,把过程打印在控制台中

BigKingTest类中的代码如下:

 package top.bigking.test;

 import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import top.bigking.bean.HelloService; public class BigKingTest {
public static void main(String[] args) {
System.out.println("开始初始化容器");
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("application.xml");
System.out.println("初始化容器结束");
HelloService helloService = (HelloService) applicationContext.getBean("helloService");
HelloService helloService1 = (HelloService) applicationContext.getBean("helloService");
helloService.sayHello();
helloService1.sayHello();
System.out.println(helloService == helloService1);
}
}

application.xml的配置如下:

 <?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean class="top.bigking.bean.HelloService" id="helloService" scope="singleton" />
</beans>

控制台的输出如下:

  开始初始化容器
DEBUG [main] - Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@3b95a09c
DEBUG [main] - Loaded 1 bean definitions from class path resource [application.xml]
DEBUG [main] - Creating shared instance of singleton bean 'helloService'
初始化容器结束
Hello, World
Hello, World
true Process finished with exit code 0

可以看到,在初始化容器时,helloService的bean对象实例就已经被创建了,后面的两次getBean都无法创建新的实例,而是直接使用这个实例,所以返回了true

以上,即可证明饿汉模式:启动容器时(即实例化容器时),为所有spring配置文件中定义的bean都生成一个实例,每次getBean请求获得的都是此实例

接下来我们证明懒汉模式:

修改application.xml,添加default-lazy-init属性

 <?xml version="1.0" encoding="UTF-8"?>
<beans default-lazy-init="true" xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean class="top.bigking.bean.HelloService" id="helloService" scope="singleton" />
</beans>

运行结果如下:

  开始初始化容器
DEBUG [main] - Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@3b95a09c
DEBUG [main] - Loaded 1 bean definitions from class path resource [application.xml]
初始化容器结束
DEBUG [main] - Creating shared instance of singleton bean 'helloService'
Hello, World
Hello, World
true Process finished with exit code 0

很明显可以看到,在容器初始化结束后,helloService实例才随着getBean被创建了出来

这样就证明了懒汉模式:在第一个请求时才生成一个实例,以后的请求都调用这个实例

问题来了,有了单例模式,那么一定有多例模式

多例模式:任何一个实例都是新的实例,调用getBean时,就new一个新实例

应该注意的是:多例模式中,实例只会随着getBean而创建,不会随着容器初始化而创建!也就是说,多例模式只有懒汉!

默认情况下scope="singleton",那么该Bean是单例

scope="prototype",则为多例,任何一个实例都是新的实例;

 <?xml version="1.0" encoding="UTF-8"?>
<beans default-lazy-init="true" xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean class="top.bigking.bean.HelloService" id="helloService" scope="prototype" />
</beans>

运行看一下结果:

  开始初始化容器
DEBUG [main] - Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@3b95a09c
DEBUG [main] - Loaded 1 bean definitions from class path resource [application.xml]
初始化容器结束
Hello, World
Hello, World
false Process finished with exit code 0

可以看到,最后的false

也就是说,这是两个被实例化的对象,是不同的!

有人可能会问,为什么控制台中,没有打印出 对象被实例化的相关信息呢?

这是因为:多例模式的对象,不归IOC容器管理!

Spring中单例模式中的饿汉和懒汉以及Spring中的多例模式的更多相关文章

  1. java中的单例模式(懒汉式+饿汉式)

    什么是单例模式: 单例模式既只能在自己本类中创建有且唯一的一个实例(姑且不考虑映射的情况)通过方法将该实例对外公开 第一种:单例模式-懒汉式 既调用getInstance()方法返回实例之前判断有没有 ...

  2. java 单利模式设计原理,饿汉式懒汉式,开发中推荐饿汉式

    单例模式的设计:  1 //Single类进内存,对象还没有存在,只有调用了getInstance方法时,才建立对象. //对象是方法被调用时,才初始化,也叫做对象的延时加载.成为:懒汉式. //Si ...

  3. java设计模式单例模式 ----懒汉式与饿汉式的区别

    常用的五种单例模式实现方式 ——主要: 1.饿汉式(线程安全,调用率高,但是,不能延迟加载.) 2.懒汉式(线程安全,调用效率不高,可以延时加载.) ——其他: 1.双重检测锁式(由于JVM底层内部模 ...

  4. Java单例模式--------懒汉式和饿汉式

    单件模式用途:单件模式属于工厂模式的特例,只是它不需要输入参数并且始终返回同一对象的引用.单件模式能够保证某一类型对象在系统中的唯一性,即某类在系统中只有一个实例.它的用途十分广泛,打个比方,我们开发 ...

  5. Java单例模式的各种实现(饿汉、懒汉、静态内部类、static代码块、enum枚举类型)

    饿汉模式 饿汉模式就是立即加载,在方法调用前,实例就已经被创建了,所以是线程安全的. public class MyObject1 { private static MyObject1 myObjec ...

  6. Spring中的单例模式和多例模式的应用

    在Spring的配置中,Bean的scope属性中存在两种模式:singleton(单例模式).prototype(多例模式) singleton 单例模式:对象在整个系统中只有一份,所有的请求都用一 ...

  7. Java设计模式 - 单例模式 (懒汉方式和饿汉方式)

    概念: Java中单例模式是一种常见的设计模式,单例模式的意思就是只有一个实例.单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个类称为单例类. 单例模式的写法有好几种,这 ...

  8. C++的单例模式与线程安全单例模式(懒汉/饿汉)

    1 教科书里的单例模式 我们都很清楚一个简单的单例模式该怎样去实现:构造函数声明为private或protect防止被外部函数实例化,内部保存一个private static的类指针保存唯一的实例,实 ...

  9. Singleton模式(单例模式) 饿汉式和懒汉式

    目的:整个应用中有且只有一个实例,所有指向该类型实例的引用都指向这个实例. 好比一个国家就只有一个皇帝(XXX),此时每个人叫的“皇帝”都是指叫的XXX本人; 常见单例模式类型: 饿汉式单例:直接将对 ...

随机推荐

  1. public class Ex2

    写出输出的结果 A. 10 2 3 4 5B. 1 2 3 4 5C. 10 2 3 4 5 0 0 0 0 0D. 1 2 3 4 5 00 0 0 0 package com.yirose.jav ...

  2. Java中CharSet字符集

    java.nio.charset包中提供了Charset类,它继承了Comparable接口:还有CharsetDecoder.CharsetEncoder编码和解码的类,它们都是继承Object类. ...

  3. python之路day15--内置函数

    函数分为自定义函数和内置函数 python内置函数分类: 5.5.1 强制转换 int() / str() / bool() / list() / tuple() / dict() / set() 5 ...

  4. hbase字典顺序表(即ASCII码表顺序)

  5. js 复杂研究

    function test_001() { var t =0; return t || out_str("t未定义"), //1 // 执行1句;在执行2句; t||null // ...

  6. Linux系统下lz4解压缩命令小结

    lz4是一个让"人见人爱.花见花开"的压缩算法,能够在多核上很好的扩展.lz4在压缩率上略微逊色, 但是在解压速度上有着惊人的优势 (大概是gzip的3倍(多次测试对比)).因为压 ...

  7. 【webpack4】webpack4配置需要注意的问题

    需要注意的知识: 要全局安装webpack以及webpack cli,否则不能使用webpack指令 npm install webpack -g npm install webpack-cli -g ...

  8. XML DOM (Document Object Model) 定义了访问和操作 XML 文档的标准方法。

    XML DOM DOM 把 XML 文档视为一种树结构.通过这个 DOM 树,可以访问所有的元素.可以修改它们的内容(文本以及属性),而且可以创建新的元素.元素,以及它们的文本和属性,均被视为节点. ...

  9. 【BZOJ2521】 [Shoi2010]最小生成树

    Description Secsa最近对最小生成树问题特别感兴趣.他已经知道如果要去求出一个n个点.m条边的无向图的最小生成树有一个Krustal算法和另一个Prim的算法.另外,他还知道,某一个图可 ...

  10. 一、Spring MVC起步——IntelliJ IDEA 搭建Spring MVC环境(手把手搭建)

    本机环境: JDK 1.7 IntelliJ IDEA 2017.2 1.新建项目 Create New Project ​ 选择Spring MVC ​ 填写项目名和项目存放位置 ​ 然后点击Fin ...