SpringBoot配置RestTemplate并理解单例模式详解

news2025/4/30 0:44:57

在日常开发中,RestTemplate 是一个非常常用的工具,用来发起HTTP请求。今天我们通过一个小例子,不仅学习如何在SpringBoot中配置RestTemplate,还会深入理解单例模式在Spring中的实际应用。


1. 示例代码

我们首先来看一个基础的配置类:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

@Configuration
public class RemoteCallConfig {

    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

上面这段代码非常简单:

  • @Configuration:表明这是一个配置类,Spring在启动时会扫描并处理这里定义的Bean。

  • @Bean:告诉Spring容器,将方法返回的对象作为一个Bean进行管理。

最终,RestTemplate就被注册到了Spring容器中。


2. Spring容器中的单例机制

那么,问题来了:每次调用restTemplate()方法,都会创建一个新的对象吗?
答案是:不会!

在Spring中,默认情况下,所有注册到容器中的Bean都是单例(Singleton)的

**单例(Singleton)**指的是:在整个应用运行期间,Spring只会创建一个对象实例,后续所有使用的地方都是同一个实例。

在上面的例子中,RemoteCallConfig类中的restTemplate()方法只会被调用一次,创建一个RestTemplate对象,后续无论在哪里注入这个Bean,得到的都是同一个对象

比如在使用的时候:

@Autowired
private RestTemplate restTemplate1;

@Autowired
private RestTemplate restTemplate2;

你会发现:

System.out.println(restTemplate1 == restTemplate2); // 输出 true

两次注入的RestTemplate其实是同一个对象,它们的内存地址是一样的。


3. Spring为什么默认使用单例?

使用单例有几个很大的好处:

(1)节省资源

每次new一个对象,都会消耗内存和CPU。而单例模式只创建一次,大大节省了资源,提升了性能。

(2)方便统一管理

比如我们给RestTemplate设置了统一的超时时间、拦截器等配置。因为它是单例的,所有地方使用时都是一致的,不需要每次都单独设置。

(3)控制对象生命周期

Spring通过单例管理,能够更好地控制对象的创建和销毁,便于资源回收和统一配置。


4. 单例需要注意什么?

虽然单例有很多优点,但也有一个需要注意的地方:

如果单例对象内部有可变状态(比如成员变量),就要考虑线程安全问题。

因为单例对象是被多个线程共享使用的,如果多个线程同时修改对象内部的变量,可能会造成脏数据或异常行为。

不过,RestTemplate线程安全的,所以直接单例使用没有问题。


5. 总结

本文通过一个简单的RestTemplate配置例子,深入讲解了Spring容器中单例模式的应用。
掌握这些基础概念,可以让我们在Spring开发中更加得心应手!

简单总结一句话:

Spring默认所有Bean是单例模式,在应用运行期间,只会创建一次,后续所有注入的都是同一个对象,节省资源,方便管理。


附加:如果想自定义RestTemplate配置怎么办?

比如设置连接超时时间,可以这样做:

@Bean
public RestTemplate restTemplate() {
    HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();
    factory.setConnectTimeout(5000); // 连接超时时间
    factory.setReadTimeout(5000);    // 读取超时时间
    return new RestTemplate(factory);
}

这样配置后,整个项目中所有使用到的RestTemplate都会自动应用这些超时时间配置!


✅ 如果你觉得这篇文章对你有帮助,可以点个赞或者关注我,一起交流学习SpringBoot更多细节哦!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2348180.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

React自定义Hook之useMutilpleRef

概要 我们在React开发时候,有时候需要绑定列表中的多个元素,便于后面对列表中单个元素的操作,但是常用的hook函数useRef只能绑定一个DOM元素,本文提供一个可以解决该问题的自定义hook方法,useMutilpleRef。 代码及实…

从线性到非线性:简单聊聊神经网络的常见三大激活函数

大家好,我是沛哥儿,我们今天一起来学习下神经网络的三个常用的激活函数。 引言:什么是激活函数 激活函数是神经网络中非常重要的组成部分,它引入了非线性因素,使得神经网络能够学习和表示复杂的函数关系。 在神经网络…

网络准入控制系统推荐:2025年构建企业网络安全的第一道防线

随着信息技术的飞速发展,企业网络环境日益复杂,阳途网络准入控制系统作为一种先进的网络安全解决方案,其核心是确保网络接入的安全性。 一、网络准入控制系统的基本原理与功能 网络准入控制以“只有合法的用户、安全的终端才可以接入网络”为…

XSS跨站--订单和Shell箱子后门

本文主要内容 手法 XSS平台使用 XSS工具使用 XSS结合其他漏洞 XSS具体使用场景 某订单系统XSS盲打_平台 某Shell箱子系统XSS盲打_工具 [1]订单系统经典案例 第一个简易攻击流程(订单系统):通过平台完成XSS跨站之后&a…

游戏遭遇DDoS攻击如何快速止损?实战防御策略与应急响应指南

是不是很抽象 我自己画的 一、游戏DDoS攻击特征深度解析 游戏行业DDoS攻击呈现复合型特征,2023年监测数据显示,针对游戏服务器的攻击中,63%采用UDP反射放大HTTP慢速攻击组合,攻击峰值达3.2Tbps。攻击者利用游戏协议特性&#xff…

cocos creator使用jenkins打包流程,打包webmobile

windows电脑使用 如果你的电脑作为打包机,一定要锁定自己的ip,如果ip动态获取,可能后续会导致jenkins无法访问,还需要重新配置jenkins和http-server的端口 从jenkins官网下载windows版 Thank you for downloading Windows Stable installer 1.jenkins安…

自动驾驶(ADAS)领域常用数据集介绍

1. KITTI 数据集 简介:由德国卡尔斯鲁厄理工学院与丰田研究院联合创建,是自动驾驶领域最经典的评测基准,涵盖立体视觉、光流、3D检测等任务。包含市区、乡村和高速公路场景的真实数据,标注对象包括车辆、行人等,支持多…

关于IDEA的循环依赖问题

bug描述:(java: 模块循环不支持注解处理。请确保将循环 [...] 中的所有模块排除在注解处理之外) 解决方法:

如何在idea中写spark程序

在 IntelliJ IDEA 中编写 Spark 程序,可按以下步骤进行: 1. 创建新项目 打开 IntelliJ IDEA,选择File -> New -> Project。在左侧面板选择Maven或者Gradle(这里以 Maven 为例),确保Project SDK选择…

RAG工程-基于LangChain 实现 Advanced RAG(预检索优化)

Advanced RAG 概述 Advanced RAG 被誉为 RAG 的第二范式,它是在 Naive RAG 基础上发展起来的检索增强生成架构,旨在解决 Naive RAG 存在的一些问题,如召回率低、组装 prompt 时的冗余和重复以及灵活性不足等。它重点聚焦在检索增强&#xff0…

《Masked Autoencoders Are Scalable Vision Learners》---CV版的BERT

目录 一、与之前阅读文章的关系? 二、标题:带掩码的自auto编码器是一个可拓展的视觉学习器 三、摘要 四、核心图 五、结果图 六、不同mask比例对比图 七、“Introduction” (He 等, 2021, p. 1) 引言 八、“Related Work” (He 等, 2021, p. 3)相…

高压直流输电MATLAB/simulink仿真模型+说明文档

1.模型简介 本仿真模型基于MATLAB/Simulink(版本MATLAB 2018Ra)软件。建议采用matlab2018 Ra及以上版本打开。(若需要其他版本可联系代为转换) 使用一个传输功率为1000MW(500 kV,2 kA)直流互连…

locust压力测试

安装 pip install locust验证是否安装成功 locust -V使用 网上的教程基本上是前几年的,locust已经更新了好几个版本,有点过时了,在此做一个总结 启动 默认是使用浏览器进行设置的 # 使用浏览器 locust -f .\main.py其他参数 Usage: locust […

第十二届蓝桥杯 2021 C/C++组 空间

目录 题目: 题目描述: 题目链接: 思路: 思路详解: 代码: 代码详解: 题目: 题目描述: 题目链接: 空间 - 蓝桥云课 思路: 思路详解&#…

以太网的mac帧格式

一.以太网的mac帧 帧的要求 1.长度 2.物理层

业绩回暖、股价承压,三只松鼠赴港上市能否重构价值锚点?

在营收重返百亿俱乐部后,三只松鼠再度向资本市场发起冲击。 4月25日,这家坚果零食巨头正式向港交所递交上市申请书,若成功登陆港股,将成为国内首个实现“AH”双上市的零食品牌。 其赴港背后的支撑力,显然来自近期披露…

JAVA-StringBuilder使用方法

JAVA-StringBuilder使用方法 常用方法 append(Object obj) 追加内容到末尾 sb.append(" World"); insert(int offset, Object obj) 在指定位置插入内容 sb.insert(5, “Java”); delete(int start, int end) 删除指定范围的字符 sb.delete(0, 5); replace(int start…

【Python】Matplotlib:立体永生花绘制

本文代码部分实现参考自CSDN博客:https://blog.csdn.net/ak_bingbing/article/details/135852038 一、引言 Matplotlib作为Python生态中最著名的可视化库,其三维绘图功能可以创造出令人惊叹的数学艺术。本文将通过一个独特的参数方程,结合极…

Unity AI-使用Ollama本地大语言模型运行框架运行本地Deepseek等模型实现聊天对话(一)

一、Ollama介绍 官方网页:Ollama官方网址 中文文档参考:Ollama中文文档 相关教程:Ollama教程 Ollama 是一个开源的工具,旨在简化大型语言模型(LLM)在本地计算机上的运行和管理。它允许用户无需复杂的配置…

SAP /SDF/SMON配置错误会导致HANA OOM以及Disk Full的情况

一般来说,为了保障每日信息收集,每个企业都会配置/SDF/SMON的监控。这样在出现性能问题时,可以通过收集到的snapshot进行分析检查。如果/SDF/SMON在配置时选取了过多的记录项,或者选择了过低的时间间隔[Interval in seconds],那显…