面试官:spring单例模式,多例模式,懒汉模式,饿汉模式(一)?

简介: 面试官:spring单例模式,多例模式,懒汉模式,饿汉模式(一)?

spring有单例模式和多例模式,首先单例模式是什么呢?


单例模式:不管获取对象几次,每次getBean都是同一个实例。


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


饿汉模式:在加载对象时候,对象就会创建实例,为所有spring配置文件中定义的bean都是生成的一个实例,天生线程安全的,多线程的情况下也不会出现问题。


懒汉模式:在获取对象第一次请求的时候,才会创建实例。本身是线程不安全的,但有几种实现线程安全的写法。


这篇文章主要介绍spring单例模式和多例模式实例,话不多说,直接上代码:


1、 spring单例模式



public static void main(String[] args) {
        log.info("加载xml  START.....");
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("application.xml");
        log.info("加载xml  END.....");
        HelloWord helloWord1 = (HelloWord)applicationContext.getBean("helloWord");
        HelloWord helloWord2 = (HelloWord)applicationContext.getBean("helloWord");
        log.info("两次取的对象是否一致:{}",helloWord1 == helloWord2);
    }

application.xml文件如下,重点,default-lazy-init="true"参数有的时候,代表是懒汉模式,吧此参数去掉,是spring饿汉模式 :


<?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="com.first.bean.HelloWord" id="helloWord" scope="singleton" />
</beans


(1)饿汉模式控制台打印如下,可以看到,饿汉模式情况下,在加载bean的时候,就会create实例,并且是同一个实例,返回true。(xml文件加去掉参数default-lazy-init="true")

image.png

2)懒汉模式控制台打印如下,可以看到,懒汉模式情况下,是在获取对象的时候create实例。(xml文件加参数default-lazy-init="true")

image.png


2、spring多例模式


有单例模式就有多例,多例模式是什么呢?


多例模式:每次获取对象getBean都会创建一个新的实例,不会在容器初始化的时候创建,所以不会在加载bean的时候创建,所以多例模式只有懒汉模式,没有饿汉模式。多例模式配置文件改为scope=“prototype”


话不多说,代码如下:

<?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="com.first.bean.HelloWord" id="helloWord" scope="prototype" />
</beans


控制台打印如下,可以看到是false,所以每次getBean的对象都是新的对象,还可以看到,并没有创建bean容器,因为多例的模式下,bean对象不归IOC容器管理。

image.png

单例,多例模式就说到这里,下篇文章着重详解懒汉模式,饿汉模式。

相关文章
|
7月前
|
监控 Cloud Native Java
Spring Integration 企业集成模式技术详解与实践指南
本文档全面介绍 Spring Integration 框架的核心概念、架构设计和实际应用。作为 Spring 生态系统中的企业集成解决方案,Spring Integration 基于著名的 Enterprise Integration Patterns(EIP)提供了轻量级的消息驱动架构。本文将深入探讨其消息通道、端点、过滤器、转换器等核心组件,以及如何构建可靠的企业集成解决方案。
690 0
|
人工智能 Java Serverless
【MCP教程系列】搭建基于 Spring AI 的 SSE 模式 MCP 服务并自定义部署至阿里云百炼
本文详细介绍了如何基于Spring AI搭建支持SSE模式的MCP服务,并成功集成至阿里云百炼大模型平台。通过四个步骤实现从零到Agent的构建,包括项目创建、工具开发、服务测试与部署。文章还提供了具体代码示例和操作截图,帮助读者快速上手。最终,将自定义SSE MCP服务集成到百炼平台,完成智能体应用的创建与测试。适合希望了解SSE实时交互及大模型集成的开发者参考。
14625 60
|
缓存 安全 Java
【JavaEE】——单例模式引起的多线程安全问题:“饿汉/懒汉”模式,及解决思路和方法(面试高频)
单例模式下,“饿汉模式”,“懒汉模式”,单例模式下引起的线程安全问题,解锁思路和解决方法
|
Java 关系型数据库 数据库
京东面试:聊聊Spring事务?Spring事务的10种失效场景?加入型传播和嵌套型传播有什么区别?
45岁老架构师尼恩分享了Spring事务的核心知识点,包括事务的两种管理方式(编程式和声明式)、@Transactional注解的五大属性(transactionManager、propagation、isolation、timeout、readOnly、rollbackFor)、事务的七种传播行为、事务隔离级别及其与数据库隔离级别的关系,以及Spring事务的10种失效场景。尼恩还强调了面试中如何给出高质量答案,推荐阅读《尼恩Java面试宝典PDF》以提升面试表现。更多技术资料可在公众号【技术自由圈】获取。
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
488 2
|
Java 调度 开发者
spring的@Scheduled()有几种定时模式?
【10月更文挑战第12天】spring的@Scheduled()有几种定时模式?
638 1
|
设计模式 缓存 Java
面试题:谈谈Spring用到了哪些设计模式?
面试题:谈谈Spring用到了哪些设计模式?
223 2
|
XML Java 开发者
经典面试---spring IOC容器的核心实现原理
作为一名拥有十年研发经验的工程师,对Spring框架尤其是其IOC(Inversion of Control,控制反转)容器的核心实现原理有着深入的理解。
954 3
|
消息中间件 设计模式 缓存
spring源码设计模式分析(四)-观察者模式
spring源码设计模式分析(四)-观察者模式