链接: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. Maven工程构建

    Maven 相关术语: 本地资源库:用来存储项目的依赖库,默认的文件夹是 “.m2” 目录 中央存储库: 用来下载所有项目的依赖库的默认位置 Maven pom.xml: 项目对象模型(Project ...

  2. 微信小程序-饮食日志_开发记录03

    这段时间主要是收尾阶段. 美化界面,排版分部等. 并进行上传,审核. 环境部署一直出现问题,所以测试版食物查找查找不到. 主要问题是:https://的网页证书没有通过审核. 所以现在推行开发,调试版 ...

  3. Python条件控制与循环

    条件控制语句:if 循环语句:while.for 其他语句:continue.break.pass 1.if语句 # ================================ a = 1 if ...

  4. caffe的网络层结构(1)

    1.concat层 该层有两个相同作用的参数: message ConcatParameter { //指定拼接的维度,默认为1即以channel通道进行拼接;支持负索引,即-1表示最后一个维度 op ...

  5. NOIP2016考前做题(口胡)记录

    NOIP以前可能会持续更新 写在前面 NOIP好像马上就要到了,感觉在校内训练里面经常被虐有一种要滚粗的感觉(雾.不管是普及组还是提高组,我都参加了好几年了,结果一个省一都没有,今年如果还没有的话感觉 ...

  6. http response压缩

    http response压缩 一.Spring boot启用Gzip压缩 application.xml新增配置: 未启用压缩时试验接口传输大小不变为61.88M,耗时1分多钟 启动压缩时试验接口传 ...

  7. BZOJ 3143 Luogu P3232 [HNOI2013]游走 (DP、高斯消元)

    题目链接: (bzoj) https://www.lydsy.com/JudgeOnline/problem.php?id=3143 (luogu) https://www.luogu.org/pro ...

  8. [BZOJ4804]欧拉心算:线性筛+莫比乌斯反演

    分析 关于这道题套路到不能再套路了没什么好说的,其实发这篇博客的目的只是为了贴一个线性筛的模板. 代码 #include <bits/stdc++.h> #define rin(i,a,b ...

  9. sqli-labs(28a)

    0X01构造闭合 爆字段数 /?id=') order by 1%23 ?id=') order by 5%23 偷看一下源码 就只过滤了union select 闭合') 那我们来尝试一下 0X02 ...

  10. Mac OS 10安装CocoaPods流程

    一.简介 什么是CocoaPods CocoaPods是OS X和iOS下的一个第三类库管理工具,通过CocoaPods工具我们可以为项目添加被称为“Pods”的依赖库(这些类库必须是CocoaPod ...