前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >面试官:spring单例模式,多例模式,懒汉模式,饿汉模式(一)?

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

作者头像
用户9919783
发布2022-07-26 11:32:23
5470
发布2022-07-26 11:32:23
举报
文章被收录于专栏:后端从入门到精通

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

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

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

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

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

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

1、 spring单例模式

代码语言:javascript
复制
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饿汉模式 :

代码语言:javascript
复制
<?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")

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

2、spring多例模式

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

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

话不多说,代码如下:

代码语言:javascript
复制
<?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容器管理。

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-06-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 后端从入门到精通 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、 spring单例模式
  • 2、spring多例模式
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档