Spring中单例模式中的饿汉和懒汉以及Spring中的多例模式
链接: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中的多例模式的更多相关文章
- java中的单例模式(懒汉式+饿汉式)
什么是单例模式: 单例模式既只能在自己本类中创建有且唯一的一个实例(姑且不考虑映射的情况)通过方法将该实例对外公开 第一种:单例模式-懒汉式 既调用getInstance()方法返回实例之前判断有没有 ...
- java 单利模式设计原理,饿汉式懒汉式,开发中推荐饿汉式
单例模式的设计: 1 //Single类进内存,对象还没有存在,只有调用了getInstance方法时,才建立对象. //对象是方法被调用时,才初始化,也叫做对象的延时加载.成为:懒汉式. //Si ...
- java设计模式单例模式 ----懒汉式与饿汉式的区别
常用的五种单例模式实现方式 ——主要: 1.饿汉式(线程安全,调用率高,但是,不能延迟加载.) 2.懒汉式(线程安全,调用效率不高,可以延时加载.) ——其他: 1.双重检测锁式(由于JVM底层内部模 ...
- Java单例模式--------懒汉式和饿汉式
单件模式用途:单件模式属于工厂模式的特例,只是它不需要输入参数并且始终返回同一对象的引用.单件模式能够保证某一类型对象在系统中的唯一性,即某类在系统中只有一个实例.它的用途十分广泛,打个比方,我们开发 ...
- Java单例模式的各种实现(饿汉、懒汉、静态内部类、static代码块、enum枚举类型)
饿汉模式 饿汉模式就是立即加载,在方法调用前,实例就已经被创建了,所以是线程安全的. public class MyObject1 { private static MyObject1 myObjec ...
- Spring中的单例模式和多例模式的应用
在Spring的配置中,Bean的scope属性中存在两种模式:singleton(单例模式).prototype(多例模式) singleton 单例模式:对象在整个系统中只有一份,所有的请求都用一 ...
- Java设计模式 - 单例模式 (懒汉方式和饿汉方式)
概念: Java中单例模式是一种常见的设计模式,单例模式的意思就是只有一个实例.单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个类称为单例类. 单例模式的写法有好几种,这 ...
- C++的单例模式与线程安全单例模式(懒汉/饿汉)
1 教科书里的单例模式 我们都很清楚一个简单的单例模式该怎样去实现:构造函数声明为private或protect防止被外部函数实例化,内部保存一个private static的类指针保存唯一的实例,实 ...
- Singleton模式(单例模式) 饿汉式和懒汉式
目的:整个应用中有且只有一个实例,所有指向该类型实例的引用都指向这个实例. 好比一个国家就只有一个皇帝(XXX),此时每个人叫的“皇帝”都是指叫的XXX本人; 常见单例模式类型: 饿汉式单例:直接将对 ...
随机推荐
- 一、redis安装、配置、命令
一.安装 参见:redis中文官方文档 “http://www.redis.cn/download.html” 下载.解压.编译Redis $ wget http://download.redis.i ...
- 解决ios横屏拍照图片自动旋转90度问题
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...
- 【NOIP2016提高组day1】换教室
题目 对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的 课程. 在可以选择的课程中,有 2n 节课程安排在 n 个时间段上. 在第 i ( 1 ≤ i ≤ n )个 时间段上,两 ...
- 两个i标签之间有缝隙
给i标签的父元素设置font-size:0:
- sh_08_打印小星星
sh_08_打印小星星 # 在控制台连续输出五行 *,每一行星号的数量依次递增 # * # ** # *** # **** # ***** # 1. 定义一个计数器变量,从数字1开始,循环会比较方便 ...
- 【BZOJ2118】墨墨的等式(同余最短路)
题意: 思路:From https://www.cnblogs.com/GavinZheng/p/11709153.html#4421510 写的1e9,int范围的 #include<bits ...
- Python黑科技:在家远程遥控公司电脑,python+微信一键连接!
有时候需要远程家里的台式机使用,因为我平时都是用 MAC 多,但是远程唤醒只能针对局域网,比较麻烦,于是我想用微信实现远程唤醒机器. 准备工作 本程序主要是实现远程管理 Windows10操作系统的开 ...
- Codechef TRIPS Children Trips (分块、倍增)
题目链接: https://www.codechef.com/problems/TRIPS 感觉CC有点毒瘤啊.. 题解: 首先有一个性质可能是因为太傻所以网上没人解释,然而我看了半天: 就是正序和倒 ...
- 修改apache2配置,禁止目录访问+禁止访问.git文件夹
通过url访问服务器,无论是本地服务器还是远程服务器 如果你的文件根目录里有 index.html,index.php,浏览器就会显示 index.html的内容,如果没有 index.html,浏览 ...
- [LeetCode]-algorithms-Longest Substring Without Repeating Characters
Given a string, find the length of the longest substring without repeating characters. For example, ...