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.yaml、application-test.yaml、application-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-autoconfigure包META-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)
🌏博客主页: 主页 🔖系列专栏: C ❤️感谢大家点赞👍收藏⭐评论✍️ 😍期待与大家一起进步! 文章目录 C语言中的类型转换一、static_cast二、reinterpret_cast三、 const_cast四、 dynamic…...
冷笑话-1
代码检视时,程序员A看着下面的代码,疑惑地问程序员B:“为什么不用重载?” class MyClass {public MyClass queryById(long id) { //......}public MyClass queryByName(String Name) { //......}public MyClass queryByIdAndNam…...
模拟退火算法(SA)求解旅行商问题(TSP)python
目录 一、模拟退火算法求解TSP(city14)的python代码 二、city14的运行结果 三、 模拟退火算法求解TSP(city30)的python代码 四、city30的运行结果 一、模拟退火算法求解TSP(city14)的python代码 impor…...
Intelijj使用Gitee团队开发
初始化项目到Gitee服务器 成功标识: 添加团队成员 点击管理——仓库成员设置——开发者 2.添加仓库成员 (最多不超过5人) 3.通过链接或者二维码邀请新成员,或者可以自己手动添加新成员并提交 多人项目仓库创建完成 通…...
气象台使用vr模拟仿真实训教学降低成本投入
气候仿真实验室用于模拟高低温、高湿、干燥、阳光光照、降雨、降雪、覆冰、雾天与强风等多种环境适应性试验等气候和环境条件,在环境试验中,温度、湿度、光照、降雨这些常见的仿真环境都很容易实现。而比较少见的雾天、强风、降雪等环境就比较难。因此为…...
智能井盖是什么?万宾科技智能井盖传感器有什么特点
智能井盖是一种基于物联网和人工智能技术的新型城市设施。它不仅具备传统井盖的功能,还能通过数字化、自动化的方式实现远程监控和智能管理,提升城市运行效率和服务水平。 WITBEE万宾智能井盖传感器EN100-C2是一款井盖异动监测的传感终端。对窨井盖状态(…...
使用 类加载器 或者 类对象 读取文件
相对路径:项目 的 根目录 开始查找。( 但是在我们真正开发的时候,我们读到的更多的文件并不是直接放在我们项目里面这个文件夹里面,而是放在我们模块里面 )同理可得,我们直接创建 文件 b.txt 会在项目的根目…...
《深度学习推荐系统》王喆 笔记
这个笔记,是我记录的阅读该书,对我比较有用的一些点。不算是能完全覆盖全书知识点的笔记。 能完全覆盖全书知识点,比较详尽的笔记,可以参考如下。 《深度学习推荐系统》超级详细读书笔记https://www.zhihu.com/tardis/bd/art/44…...
微软Azure OpenAI支持数据微调啦!可打造专属ChatGPT
10月17日,微软在官网宣布,现在可以在Azure OpenAI公共预览版中对GPT-3.5-Turbo、Babbage-002 和Davinci-002模型进行数据微调。 使得开发人员通过自己的数据集,便能打造独一无二的ChatGPT。例如,通过海量医疗数据进行微调&#x…...
Kali Linux 安装搭建 hadoop 平台 详细教程
1)前期环境准备:(虚拟机、jdk、ssh) 2)SSH相关配置 安装SSH Server服务器:apt-get install openssh-server 更改默认的SSH密钥 cd /etc/ssh mkdir ssh_key_backup mv ssh_host_* ssh_key_backup 创建新…...
leetcode做题笔记190. 颠倒二进制位
颠倒给定的 32 位无符号整数的二进制位。 提示: 请注意,在某些语言(如 Java)中,没有无符号整数类型。在这种情况下,输入和输出都将被指定为有符号整数类型,并且不应影响您的实现,因…...
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:亮点
本章内容包含: 在Power BI Desktop上学习诀窍摄入数据使用模型试用Power BI服务 就像评估一个由多种成分组成的蛋糕一样,Power BI要求其用户熟悉商业智能(BI)解决方案中的功能。几乎所有与Power BI交互的用户都是从桌面版开始的…...
网络参考资料搬运(3)
(1) Python: 使用Python打开新的终端(terminal)并执行语句 通过Python 打开各系统(MAC, LINUX, WINDOWS)下的终端 (Terminal) python执行shell脚本的几种方法 自己写Linux命令 用Python写个Linux系统命令 Python 使用sftp传输文件…...
Bias in Emotion Recognition with ChatGPT
本文是LLM系列文章,针对《Bias in Emotion Recognition with ChatGPT》的翻译。 chatGPT在情绪识别中的偏差 摘要1 引言2 方法3 结果4 讨论5 结论 摘要 本技术报告探讨了ChatGPT从文本中识别情绪的能力,这可以作为交互式聊天机器人、数据注释和心理健康…...
【PACS系统源码】与医院HIS系统双向数据交换,实现医学影像集成与影像后处理功能
医院医学影像PACS系统源码,集成三维影像后处理功能,包括三维多平面重建、三维容积重建、三维表面重建、三维虚拟内窥镜、最大/小密度投影、心脏动脉钙化分析等功能。系统功能强大,代码完整。 PACS系统与医院HIS实现双向数据交换,…...
深度学习中常用的激活函数有sigmoid、tanh、ReLU、LeakyReLU、PReLU、GELU等。
深度学习中常用的激活函数 1. Sigmoid函数2. Tanh函数3. ReLU函数4. LeakyReLU函数5. PReLU函数6. ELU函数:7. GELU函数: 深度学习中常用的激活函数有sigmoid、tanh、ReLU、LeakyReLU、PReLU等。 1. Sigmoid函数 Sigmoid函数公式为 f ( x ) 1 1 e −…...
mysql同时使用order by排序和limit分页数据重复问题
目录 场景再现: 解决方案: 问题分析: mysql官方描述: 场景再现: 最近排查数据时发现使用order by及limit分页时会出现不同页数数据重复问题及有的数据分页不会显示,但是按条件搜索就可以搜索出来。 解决方案&#x…...
英语——歌诀篇——歌诀记忆法
介词用法速记歌 年月季前要用in, 日子前面却不行。 遇到几号要用on, 上午下午又用in。 要说某时上下午, 用on换in才可行。 午夜黄昏和黎明, 要用at不用in。 差儿分到几点, 写个“to”在中间。 若是几点过几分…...
避坑指南:在Ubuntu 16.04上从零搭建VINS-Mono环境(含ROS Kinetic、OpenCV 3.3.1、Ceres 1.14.0)
VINS-Mono环境配置全攻略:从版本对齐到避坑实践 在视觉惯性里程计(VIO)领域,VINS-Mono作为香港科技大学开源的经典方案,至今仍是许多研究者和工程师入门的首选框架。然而,其复杂的依赖环境和严格的版本要求…...
# 发散创新:用Go语言打造绿色计算的高效任务调度器在当今算力爆炸的时代
发散创新:用Go语言打造绿色计算的高效任务调度器 在当今算力爆炸的时代,绿色计算已从理念走向实践。它不仅关乎节能减排,更体现在如何以更低能耗完成更高效率的任务处理。本文将通过一个真实可运行的 Go 语言项目——GreenSchedulerÿ…...
结构体进阶
文章目录全局/局部变量重命名方式初始化结构体类型结构体内存对齐位段例如:小端存储枚举联合全局/局部变量 重命名方式 初始化 结构体类型 结构体内存对齐 位段 位段(Bit-Field)是 C 语言结构体里的一种特殊用法,它允许你按 “位…...
不依赖对话日志检测Prompt注入,一套隐私优先的实现方案
来源:DeepHub IMBA 本文约2600字,建议阅读5分钟如果只保留遥测数据(关于会话行为的数值信号)实际上能保留多少检测能力?检测 Prompt 注入和越狱攻击的方法,大多建立在系统可以访问对话日志这个前提上。但是…...
别再乱补零了!用MATLAB/Octave做FFT频谱分析时,这3个细节直接决定结果准不准
FFT频谱分析实战:补零操作的三大误区与精准避坑指南 信号处理工程师们常说:"FFT是数字信号处理的显微镜。"但显微镜若未校准,看到的可能是失真的世界。在MATLAB/Octave环境中进行频谱分析时,补零操作看似简单࿰…...
重新定义四足机器人:openDogV2从机械执行到环境感知的颠覆性演进
重新定义四足机器人:openDogV2从机械执行到环境感知的颠覆性演进 【免费下载链接】openDogV2 项目地址: https://gitcode.com/gh_mirrors/op/openDogV2 在机器人技术快速发展的今天,开源四足机器人项目openDogV2正在重新定义智能机械伙伴的可能性…...
魔兽争霸3终极兼容性指南:如何使用WarcraftHelper解决现代系统问题
魔兽争霸3终极兼容性指南:如何使用WarcraftHelper解决现代系统问题 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 还在为魔兽争霸3在新系…...
基于C++实现工业级线程安全日志系统
在服务端开发级中小型应用中,稳定、易用、带自动切割与过期清理的日志模块是必需的,本文基于C17及以上标准,实现一款单例模式、线程安全、控制台彩色输出、按时间/大小自动切分、过期日志自动清理的企业级日志系统,代码可直接集成…...
MATLAB/Simulink仿真研究:基于下垂控制的蓄电池SOC均衡策略
MATLAB/Simulink仿真,蓄电池SOC均衡 采用下垂控制,根据自身容量选择出力,直流母线电压、功率保持稳定无波动 MATLAB/Simulink仿真,蓄电池SOC均衡(锂电池) 根据微网内功率盈余,两组SOC不同的蓄电…...
NVIDIA Profile Inspector深度实战:解锁显卡隐藏性能的完整技术指南
NVIDIA Profile Inspector深度实战:解锁显卡隐藏性能的完整技术指南 【免费下载链接】nvidiaProfileInspector 项目地址: https://gitcode.com/gh_mirrors/nv/nvidiaProfileInspector NVIDIA Profile Inspector是一款能够深度访问NVIDIA驱动内部游戏配置文件…...
