当前位置: 首页 > news >正文

SpringBoot (3) Profiles,外部化配置,自定义starter

目录

1 Profiles

1.1 "组件"环境隔离

1.1.1 标识环境

1.1.2 激活环境

1.2 "配置"环境隔离

1.2.1 添加"副配置文件"

1.2.2 激活环境

2 外部化配置

2.1 配置优先级

2.2 快速部署

3 自定义starter

3.1 基本抽取

3.1.1 导yaml提示包

3.1.2 【公共模块】抽取

3.1.3 【普通模块】引用

3.2 @EnableXxx注解抽取

3.3 自动配置抽取

3.3.1 SPI机制

3.3.2 全自动配置


1 Profiles

用于"环境隔离",能够快速切换开发环境(dev),测试环境(test),生产环境(prod)等

1.1 "组件"环境隔离

针对不同的环境,往SpringIOC容器中注册不同的组件

1.1.1 标识环境

        @Profile({"dev","test"})注解可以配合@Component等注解使用,也可以配合@Bean注解使用,标记当前组件在指定环境下生效

        没有标@Profile的类,在任何环境下都生效

        @Profile对于@EnableConfigurationProperties({Dog.class,Cat.class})中的Dog类、Cat类不生效(即Dog类用了@Profile也会被注册进SpirngIOC)

1.1.2 激活环境

        在properties.yaml文件中激活对应的环境,如果没有配置对应的"激活环境",则SpringBoot默认激活default环境; 如果配置了"激活环境",则default环境失效

spring:profiles:active: dev,test

1.2 "配置"环境隔离

针对不同的环境,选择生效的"副配置文件"(主配置文件application.yaml永远生效)

1.2.1 添加"副配置文件"

        例如:application-dev.yamlapplication-test.yamlapplication-prod.yaml

1.2.2 激活环境

        激活方式与1.1.2相同,且只能写在主配置文件中:

                例如:spring.profiles.active=dev,则application-dev.yaml生效

        如果"副配置文件"和"主配置文件"配置冲突,以"副配置文件"为准

2 外部化配置

2.1 配置优先级

        命令行 > 包内外  (例: java -jar demo.jar --server.port=9999)

        jar包外配置优先级 > jar包内配置优先级

        副配置优先级 > 主配置优先级

包内:(1)application.yaml       #server.port=8000(2)application-dev.yaml   #server.port=8001
包外:(3)application.yaml       #server.port=9000(4)application-dev.yaml   #server.port=9001//有(1),以(1)为准
//有(1)(2),以(2)为准
//有(1)(2)(3),以(2)为准
//有(1)(2)(3)(4),以(4)为准//执行的是命令行,以命令行为准

2.2 快速部署

        根据"配置优先级"的规则,当需要修改某一项配置,无需再重新打jar包部署,而只需要新建一个与jar包文件同级别的"外部配置文件",然后用java -jar命令再次执行jar包即可

3 自定义starter

        当我们在编写多个模块时,往往有许多重复代码,可以考虑将这些重复代码抽取出来作为一个starter,然后让模块去引用此starter即可

3.1 基本抽取

3.1.1 导yaml提示包

        在yaml中配置SpringBoot官方给的配置,当输入相关值的时候,会有提示

        而一些自定义的配置(例如:属性绑定时),则在yaml文件中不会有提示,而且被属性绑定的类还会被IDEA标红提示

        只需要引入spring提供的starter即可解决

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><optional>true</optional>
</dependency>

3.1.2 【公共模块】抽取

        (1) 创建公共模块,可以起名为xxx-xxx-spring-boot-starter

        (2) 导入此模块需要的依赖(jar包和starter),以及其它模块们都需要的公共依赖(这样其它模块就无须引入公共依赖了)

        (3) 抽取公共代码(例如:问候接口/hello/welcome)

        (4) 因为SpringBoot默认只会扫描自己主程序的包,外部引入的依赖包不会被扫描到,所以:

                在【公共模块】的Spring配置类中,用@import或@Bean引入需要注册的组件(如Controller,Service,pojo等)

                在【普通模块】引入【公共模块】后,在Spring配置类中用@Import或@Bean引入【公共模块】的Spring配置类

<!--新建一个【公共模块】,导入此模块需要的包,导入【普通模块】们都需要的公共依赖-->
<groupId>starter.xyz.aboluo</groupId>
<artifactId>aboluo-hello-spring-boot-starter</artifactId>
<version>1.0</version>// 【公共模块】抽取公共代码(以"问候接口/hello/welcome"为例)
@RestController
@RequestMapping("/hello")
public class HelloController {@Autowiredprivate HelloServiceImpl helloService;  //注意:这里@Autowired的是ServiceImpl类,并不是Service接口(因为在【普通模块】中加载不到)@PostMapping("/welcome")public String hello() {return helloService.hello();}
}//@Service  因为在Spring配置类中被用@Import引入了,此注解可以不写
public class HelloServiceImpl {@Autowiredprivate HelloProperties helloProperties;public String hello() {return helloProperties.getWelcomeMessage() + "本服务是由【" + helloProperties.getCompanyName() + "】公司提供技术支持";}
}//【自动配置类】
//@Component  因为在Spring配置类中被用@EnableConfigurationProperties引入了,此注解可以不写
@ConfigurationProperties(prefix = "hello")
public class HelloProperties {private String welcomeMessage;private String companyName;
}@SpringBootConfiguration
@ComponentScan("starter.xyz.aboluo")
//因为这些类在【普通模块】中不会被扫描到,所以全部引入到Spring配置类中
@Import({HelloController.class, HelloServiceImpl.class})
@EnableConfigurationProperties({Hello.class})
public class AboluoHelloAutoConfiguration {
}

3.1.3 【普通模块】引用

<!--【普通模块】引入"自定义starter"-->
<dependency><groupId>starter.xyz.aboluo</groupId><artifactId>aboluo-hello-spring-boot-starter</artifactId><version>1.0</version>
</dependency>//【普通模块】的Spring配置类中用@Import引入【公共模块】的Spring配置类
@SpringBootConfiguration
@MapperScan("xyz.aboluo.dao")
@Import(AboluoHelloAutoConfiguration.class)
public class SpringConfig {
}// 在yaml中对Hello类进行"属性绑定"
hello:welcome-message: 欢迎您的使用!company-name: 字节跳动//此时依赖【公共模块】的【普通模块】启动后,就可以访问到"问候接口/hello/welcome"

3.2 @EnableXxx注解抽取

        使用3.1的抽取方式的弊端:【普通模块】引入【公共模块】后,需要在Spring配置类上用@Import引入【公共模块】的Spring配置类

        利用Enable机制,可以在【公共模块】中自定义一个@EnableXxx注解,【普通模块】在Spring配置类使用【公共模块】的自定义注解即可,无需再使用@Import了

//【公共模块】自定义注解
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
@Documented
@Import({HelloController.class, HelloServiceImpl.class, Hello.class})
public @interface EnableHello {
}//【普通模块】的Spring配置类上使用"自定义注解"
@SpringBootConfiguration
@MapperScan("xyz.aboluo.dao")
@EnableHello
public class SpringConfig {
}

3.3 自动配置抽取

3.3.1 SPI机制

        (Java的SPI默认访问META-INF/services/目录下的文件)

        (SpringBoot的SPI默认访问META-INF/spring/目录下的文件)

        项目引入官方starter依赖时,这个starter会继续依赖spring-boot-starter,其中一个核心依赖是spring-boot-autoconfigure,此时SpirngBoot会触发一个行为,自动去找org.springframework.boot:spring-boot-autoconfigureMETA-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件

        此文件中所有的类(自动配置类一般写为XxxAutoConfiguration)会在项目启动时自动加载(被注册进SpringIOC),主要作用就是向SpringIOC容器中添加一些组件(用@Import或@Bean的方式)

        并且会用@EnableConfigurationProperties指定对应的配置属性类,开启属性绑定

3.3.2 全自动配置

        使用3.2的抽取方式,还需要在【普通模块】的Spring配置类写"自定义注解",有没有可能连自定义注解也不用写,直接引入【公共模块】就可以用呢?

        利用SPI机制,在【公共模块】"类资源文件夹"resource下放META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件,并写入Spring配置类(主要是要其中的@Import)的全限定类名

//新建resource/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件
starter.xyz.aboluo.boot.AboluoHelloAutoConfiguration@SpringBootConfiguration
@ComponentScan("starter.xyz.aboluo")
@Import({HelloController.class, HelloServiceImpl.class})
@EnableConfigurationProperties({HelloProperties.class})
public class AboluoHelloAutoConfiguration {
}

相关文章:

SpringBoot (3) Profiles,外部化配置,自定义starter

目录 1 Profiles 1.1 "组件"环境隔离 1.1.1 标识环境 1.1.2 激活环境 1.2 "配置"环境隔离 1.2.1 添加"副配置文件" 1.2.2 激活环境 2 外部化配置 2.1 配置优先级 2.2 快速部署 3 自定义starter 3.1 基本抽取 3.1.1 导yaml提示包 3…...

【C++】类型转换(dynamic_cast,const_cast,static_cast,reinterpret_cast)

&#x1f30f;博客主页&#xff1a; 主页 &#x1f516;系列专栏&#xff1a; C ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ &#x1f60d;期待与大家一起进步&#xff01; 文章目录 C语言中的类型转换一、static_cast二、reinterpret_cast三、 const_cast四、 dynamic…...

冷笑话-1

代码检视时&#xff0c;程序员A看着下面的代码&#xff0c;疑惑地问程序员B&#xff1a;“为什么不用重载&#xff1f;” class MyClass {public MyClass queryById(long id) { //......}public MyClass queryByName(String Name) { //......}public MyClass queryByIdAndNam…...

模拟退火算法(SA)求解旅行商问题(TSP)python

目录 一、模拟退火算法求解TSP&#xff08;city14&#xff09;的python代码 二、city14的运行结果 三、 模拟退火算法求解TSP&#xff08;city30&#xff09;的python代码 四、city30的运行结果 一、模拟退火算法求解TSP&#xff08;city14&#xff09;的python代码 impor…...

Intelijj使用Gitee团队开发

初始化项目到Gitee服务器 成功标识&#xff1a; 添加团队成员 点击管理——仓库成员设置——开发者 2.添加仓库成员 &#xff08;最多不超过5人&#xff09; 3.通过链接或者二维码邀请新成员&#xff0c;或者可以自己手动添加新成员并提交 多人项目仓库创建完成 通…...

气象台使用vr模拟仿真实训教学降低成本投入

气候仿真实验室用于模拟高低温、高湿、干燥、阳光光照、降雨、降雪、覆冰、雾天与强风等多种环境适应性试验等气候和环境条件&#xff0c;在环境试验中&#xff0c;温度、湿度、光照、降雨这些常见的仿真环境都很容易实现。而比较少见的雾天、强风、降雪等环境就比较难。因此为…...

智能井盖是什么?万宾科技智能井盖传感器有什么特点

智能井盖是一种基于物联网和人工智能技术的新型城市设施。它不仅具备传统井盖的功能&#xff0c;还能通过数字化、自动化的方式实现远程监控和智能管理&#xff0c;提升城市运行效率和服务水平。 WITBEE万宾智能井盖传感器EN100-C2是一款井盖异动监测的传感终端。对窨井盖状态(…...

使用 类加载器 或者 类对象 读取文件

相对路径&#xff1a;项目 的 根目录 开始查找。&#xff08; 但是在我们真正开发的时候&#xff0c;我们读到的更多的文件并不是直接放在我们项目里面这个文件夹里面&#xff0c;而是放在我们模块里面 &#xff09;同理可得&#xff0c;我们直接创建 文件 b.txt 会在项目的根目…...

《深度学习推荐系统》王喆 笔记

这个笔记&#xff0c;是我记录的阅读该书&#xff0c;对我比较有用的一些点。不算是能完全覆盖全书知识点的笔记。 能完全覆盖全书知识点&#xff0c;比较详尽的笔记&#xff0c;可以参考如下。 《深度学习推荐系统》超级详细读书笔记https://www.zhihu.com/tardis/bd/art/44…...

微软Azure OpenAI支持数据微调啦!可打造专属ChatGPT

10月17日&#xff0c;微软在官网宣布&#xff0c;现在可以在Azure OpenAI公共预览版中对GPT-3.5-Turbo、Babbage-002 和Davinci-002模型进行数据微调。 使得开发人员通过自己的数据集&#xff0c;便能打造独一无二的ChatGPT。例如&#xff0c;通过海量医疗数据进行微调&#x…...

Kali Linux 安装搭建 hadoop 平台 详细教程

1&#xff09;前期环境准备&#xff1a;&#xff08;虚拟机、jdk、ssh&#xff09; 2&#xff09;SSH相关配置 安装SSH Server服务器&#xff1a;apt-get install openssh-server 更改默认的SSH密钥 cd /etc/ssh mkdir ssh_key_backup mv ssh_host_* ssh_key_backup 创建新…...

leetcode做题笔记190. 颠倒二进制位

颠倒给定的 32 位无符号整数的二进制位。 提示&#xff1a; 请注意&#xff0c;在某些语言&#xff08;如 Java&#xff09;中&#xff0c;没有无符号整数类型。在这种情况下&#xff0c;输入和输出都将被指定为有符号整数类型&#xff0c;并且不应影响您的实现&#xff0c;因…...

JAVA如何获取服务器ip

一、最简单的方法就是使用InetAddress获取本机ip InetAddress.getLocalHost().getHostAddress(); public static void main(String[] args) {try {//用 getLocalHost() 方法创建的InetAddress的对象InetAddress address InetAddress.getLocalHost();System.out.println(addr…...

Power BI 傻瓜入门 4. Power BI:亮点

本章内容包含&#xff1a; 在Power BI Desktop上学习诀窍摄入数据使用模型试用Power BI服务 就像评估一个由多种成分组成的蛋糕一样&#xff0c;Power BI要求其用户熟悉商业智能&#xff08;BI&#xff09;解决方案中的功能。几乎所有与Power BI交互的用户都是从桌面版开始的…...

网络参考资料搬运(3)

(1) Python: 使用Python打开新的终端(terminal)并执行语句 通过Python 打开各系统&#xff08;MAC, LINUX, WINDOWS&#xff09;下的终端 &#xff08;Terminal&#xff09; python执行shell脚本的几种方法 自己写Linux命令 用Python写个Linux系统命令 Python 使用sftp传输文件…...

Bias in Emotion Recognition with ChatGPT

本文是LLM系列文章&#xff0c;针对《Bias in Emotion Recognition with ChatGPT》的翻译。 chatGPT在情绪识别中的偏差 摘要1 引言2 方法3 结果4 讨论5 结论 摘要 本技术报告探讨了ChatGPT从文本中识别情绪的能力&#xff0c;这可以作为交互式聊天机器人、数据注释和心理健康…...

【PACS系统源码】与医院HIS系统双向数据交换,实现医学影像集成与影像后处理功能

​医院医学影像PACS系统源码&#xff0c;集成三维影像后处理功能&#xff0c;包括三维多平面重建、三维容积重建、三维表面重建、三维虚拟内窥镜、最大/小密度投影、心脏动脉钙化分析等功能。系统功能强大&#xff0c;代码完整。 PACS系统与医院HIS实现双向数据交换&#xff0c…...

深度学习中常用的激活函数有sigmoid、tanh、ReLU、LeakyReLU、PReLU、GELU等。

深度学习中常用的激活函数 1. Sigmoid函数2. Tanh函数3. ReLU函数4. LeakyReLU函数5. PReLU函数6. ELU函数&#xff1a;7. GELU函数&#xff1a; 深度学习中常用的激活函数有sigmoid、tanh、ReLU、LeakyReLU、PReLU等。 1. Sigmoid函数 Sigmoid函数公式为 f ( x ) 1 1 e −…...

mysql同时使用order by排序和limit分页数据重复问题

目录 场景再现&#xff1a; 解决方案&#xff1a; 问题分析&#xff1a; mysql官方描述&#xff1a; 场景再现&#xff1a; 最近排查数据时发现使用order by及limit分页时会出现不同页数数据重复问题及有的数据分页不会显示,但是按条件搜索就可以搜索出来。 解决方案&#x…...

英语——歌诀篇——歌诀记忆法

介词用法速记歌 年月季前要用in&#xff0c; 日子前面却不行。 遇到几号要用on&#xff0c; 上午下午又用in。 要说某时上下午&#xff0c; 用on换in才可行。 午夜黄昏和黎明&#xff0c; 要用at不用in。 差儿分到几点&#xff0c; 写个“to”在中间。 若是几点过几分&#xf…...

别再死记硬背了!华为交换机日常运维,这10条display命令搞定80%的活儿

华为交换机高效运维&#xff1a;10条核心命令解决80%日常问题 刚接触华为交换机的网络工程师&#xff0c;常常陷入命令海洋的迷茫——面对数百条指令&#xff0c;哪些才是真正高频使用的"杀手锏"&#xff1f;经过对实际运维场景的长期观察&#xff0c;我们发现80%的日…...

如何轻松实现跨平台词库迁移:深蓝词库转换工具完整指南

如何轻松实现跨平台词库迁移&#xff1a;深蓝词库转换工具完整指南 【免费下载链接】imewlconverter ”深蓝词库转换“ 一款开源免费的输入法词库转换程序 项目地址: https://gitcode.com/gh_mirrors/im/imewlconverter 你是否曾因更换输入法而丢失多年积累的词库&#…...

蓝牙耳机控制手机音乐的幕后功臣:一文搞懂AVRCP协议(附PASS THROUGH指令详解)

蓝牙耳机控制手机音乐的幕后功臣&#xff1a;AVRCP协议深度解析与实战指南 当你在通勤路上用蓝牙耳机轻触"下一曲"按钮时&#xff0c;背后是一套精密的无线控制协议在发挥作用。AVRCP&#xff08;Audio/Video Remote Control Profile&#xff09;作为蓝牙技术联盟定义…...

学工平台让学生请假告别繁琐,移动审批随时处理

✅作者简介&#xff1a;合肥自友科技 &#x1f4cc;核心产品&#xff1a;智慧校园平台(包括教工管理、学工管理、教务管理、考务管理、后勤管理、德育管理、资产管理、公寓管理、实习管理、就业管理、离校管理、科研平台、档案管理、学生平台等26个子平台) 。公司所有人员均有多…...

开源可部署|embeddinggemma-300m + Ollama构建私有化语义搜索服务

开源可部署&#xff5c;embeddinggemma-300m Ollama构建私有化语义搜索服务 1. 引言&#xff1a;为什么需要私有化语义搜索 在日常工作和学习中&#xff0c;我们经常需要从大量文档中快速找到相关信息。传统的关键词搜索往往不够智能&#xff0c;无法理解语义层面的相似性。…...

3步快速上手:N_m3u8DL-CLI-SimpleG图形界面视频下载实战指南

3步快速上手&#xff1a;N_m3u8DL-CLI-SimpleG图形界面视频下载实战指南 【免费下载链接】N_m3u8DL-CLI-SimpleG N_m3u8DL-CLIs simple GUI 项目地址: https://gitcode.com/gh_mirrors/nm3/N_m3u8DL-CLI-SimpleG 想要轻松下载在线视频却苦于复杂的命令行操作&#xff1f…...

Docker网络性能压测报告(实测数据:macvlan vs ipvlan vs CNI插件吞吐对比),附可复用的perf+tcpdump诊断脚本

第一章&#xff1a;Docker网络性能压测报告&#xff08;实测数据&#xff1a;macvlan vs ipvlan vs CNI插件吞吐对比&#xff09;&#xff0c;附可复用的perftcpdump诊断脚本为量化不同Docker网络驱动在高并发场景下的真实吞吐能力&#xff0c;我们在统一硬件环境&#xff08;I…...

Pinpoint部署完数据刷不出来?排查HBase 1.4.9单机版这些配置坑(附GC优化参数)

Pinpoint数据刷不出来&#xff1f;HBase单机版配置与GC调优实战指南 当你终于按照教程部署完Pinpoint全家桶&#xff0c;满心期待打开Web界面时&#xff0c;却发现数据迟迟不出现——这种挫败感我太熟悉了。去年我们团队迁移微服务监控体系时就遇到过完全相同的困境。本文将分享…...

BraTS数据集保姆级使用指南:从下载、预处理到可视化(附Python脚本)

BraTS数据集实战手册&#xff1a;从零构建医学影像处理流水线 第一次打开BraTS数据集时&#xff0c;我被那些密密麻麻的NIfTI文件弄得晕头转向——四种模态、三种标注、数百个病例&#xff0c;每个文件都像是一本需要特殊解码器的三维图书。作为过来人&#xff0c;我完全理解初…...

一文速览最新发布的《CMMI中国2025优秀实践案例集》

为推动软件产业高质量发展、推广工程领域优秀实践&#xff0c;近日&#xff0c;由CMMI研究院中国卓越中心、中关村智联软件服务业质量创新联盟联合编纂的《CMMI中国2025年度优秀实践案例集》&#xff08;以下简称《CMMI案例集》&#xff09;正式发布。2025年得CMMI案例筛选出代…...