链接: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. 美国的电信巨头T-Mobile今天披露了另一起数据遭黑客泄露事件

    您是T-Mobile预付费客户吗?如果是,您应该立即创建或更新您关联的帐户PIN /密码,以提供额外的保护.总部位于美国的电信巨头T-Mobile今天披露了另一起数据泄露事件,该事件最近暴露了一些使用 ...

  2. VC内联汇编和GCC内联汇编的语法区别

    VC: #include <stdio.h> main(){ int a = 1; int b = 2; int c; __asm{ mov eax,a mov ebx,b mov ecx ...

  3. get和post请求的区别?

    ①get请求用来从服务器上获得资源,而post是用来向服务器提交数据: ②get将表单中数据按照name=value的形式,添加到action 所指向的URL 后面,并且两者使用“?”连接,而各个变量 ...

  4. jmeter使用jdbc获取注册验证码进行注册

    自动化工具测试注册功能时,往往会遇到验证码,这个烦人的验证码怎么能够解决掉呢? 通常有两种方法 让开发禁用注册码,或在测试环境写个固定的验证码 在jmeter中用 jdbc获取数据库中验证码 今天通过 ...

  5. Hibernate实体对象的生命周期(三种状态)

    瞬时状态(Transient) 通过new创建对象后,对象并没有立刻持久化,它并未与数据库中的数据有任何关联,此时Java对象的状态为瞬时状态. Session对于瞬时状态的Java对象是一无所知的, ...

  6. LDA终极分析

    http://www.cnblogs.com/pinard/p/6867828.html http://www.52nlp.cn/lda-math-mcmc-和-gibbs-sampling2 htt ...

  7. 【leetcode】1227. Airplane Seat Assignment Probability

    题目如下: n passengers board an airplane with exactly n seats. The first passenger has lost the ticket a ...

  8. mysql 发现 navicat 可以远程连接,代码无法远程连接

    navicat可以远程连接, root账号也可以用代码连接. 其他的用户无法远程连接. 原因: 1.先检查下 mysql数据库里面 的 servers 表是否存在. 2.更新或者创建用户之后 使用:  ...

  9. springboot(十)使用LogBack作为日志组件

    简介: 企业级项目在搭建的时候,最不可或缺的一部分就是日志,日志可以用来调试程序,打印运行日志以及错误信息方便于我们后期对系统的维护,在SpringBoot兴起之前记录日志最出色的莫过于log4j了, ...

  10. FastDfs单机版搭建

    详细的最新版fastdfs单机版搭建 前言 目前项目是tomcat单机部署的,图片.视频也是上传到tomcat目录下,关键是此项目的主要内容还就是针对图片.视频的,这让我非常担忧:文件服务器的应用是必 ...