LOOK ! SpringBoot的外部化配置最全解析,springcloud开发教程

关于配置文件,properties和yaml文件都能够满足配置的需求。

当然,这些配置都是灵活的,如果你不喜欢默认的配置文件命名或者默认的路径,你都可以进行配置:

$ java -jar myproject.jar --spring.config.name=myproject

$ java -jar myproject.jar --spring.config.location=classpath:/default.properties,classpath:/override.properties

4、指定profile属性

=================================================================================

通常情况下,我们开发的应用程序需要部署到不同的环境下,属性的配置自然也需要不同。如果每次在发布的时候替换配置文件,过于麻烦。SpringBoot的多环境配置为此提供了便利。具体做法如下:

我们之前在介绍各种配置的优先级的时候说过, application-{profile}.properties或者application-{profile}.yml文件 的优先级高于 application.properties或application.yml 配置,这里的profile就是我们定义的环境标识:

我们在resource目录下创建三个文件:

  • application.properties:默认的配置,default。

  • application-dev.properties:开发环境,dev。

  • application-prod.properties:生产环境,prod。

我们可以通过指定 spring.profiles.active 属性来激活对应的配置环境:

spring.profiles.active=dev

或使用命令行参数的配置形式:

$ java -jar hyh.jar --spring.profiles.active=dev

如果没有profile指定的文件于profile指定的文件的配置属性同时定义,那么指定profile的配置优先。

5、使用占位符

===========================================================================

在使用application.properties中的值的时候,他们会从Environment中获取值,那就意味着,可以引用之前定义过的值,比如引用系统属性。具体做法如下:

name=天乔巴夏

description=${name} is my name

6、加密属性

==========================================================================

Spring Boot不提供对加密属性值的任何内置支持,但是,它提供了 修改Spring环境中的值所必需的挂钩点。我们可以通过实现EnvironmentPostProcessor接口在应用程序启动之前操纵Environment。

可以参考 howto.html ,查看具体使用方法。

7、使用YAML代替properties

========================================================================================

YAML是JSON的超集,是一种 指定层次结构配置数据的便捷格式 ,我们以properties文件对比一下就知道了:

#properties

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

spring.datasource.url=jdbc:mysql://localhost:3306/test?serverTimezone=GMT%2B8

spring.datasource.username=root

spring.datasource.password=123456

my.servers[0]=www.hyh.com

my.servers[1]=www.yhy.com

yml

spring:

datasource:

driver-class-name: com.mysql.cj.jdbc.Driver

url: jdbc:mysql://localhost:3306/test?serverTimezone=GMT%2B8

username: root

password: 123456

my:

server:

  • www.hyh.com

  • www.yhy.com

只要在类路径上具有SnakeYAML库,SpringApplication类就会自动支持YAML作为属性配置的方式。SpringBoot项目中的 spring-boot-starter 已经提供了相关类库: org.yaml.snakeyaml,因此SpringBoot天然支持这种方式配置。

关于yaml文件的格式,可以参考官方文档: Using YAML Instead of Properties

8、类型安全的属性配置

===============================================================================

上面说到通过 @Value(“${property}”) 注解来注入配置有时会比较麻烦,特别是当多个属性本质上具有层次结构的时候。SpringBoot提供了一种解决方案: 让强类型的bean管理和验证你的配置

直接来看具体的使用叭:

@ConfigurationPropertie定义一个绑定配置的JavaBean

============================================================================================================

  1. 使用默认构造器+getter和setter注入

@ConfigurationProperties(“acme”)

public class AcmeProperties {

private boolean enabled; //acme.enabled 默认为false

private InetAddress remoteAddress;// acme.remote-address 可以从String转换而来的类型

private final Security security = new Security();

//… 省略getter和setter方法

public static class Security {

private String username; // acme.security.username

private String password; // acme.security.password

private List roles = new ArrayList<>(Collections.singleton(“USER”));// acme.security.roles

//… 省略getter setter方法

}

}

这种方式依赖于默认的空构造函数,通过getter和setter方法赋值,因此getter和setter方法是必要的,且不支持静态属性的绑定。

如果嵌套pojo属性已经被初始化值: private final Security security = new Security(); 可以不需要setter方法。如果希望绑定器使用其默认构造函数动态创建实例,则需要setter。

  1. 通过@ContructorBinding注解使用构造器绑定的方式:

@ConstructorBinding //标注使用构造器绑定

@ConfigurationProperties(“acme”)

public class AcmeProperties {

private final Security security;

private final boolean enabled;

private final InetAddress remoteAddress;

public AcmeProperties(boolean enabled, InetAddress remoteAddress, Security security) {

this.enabled = enabled;

this.remoteAddress = remoteAddress;

this.security = security;

}

//…省略getter方法

@ToString

public static class Security {

private final String username;

private final String password;

private final List roles;

public Security(String username, String password,

@DefaultValue(“USER”) List roles) {

this.username = username;

this.password = password;

this.roles = roles;

}

}

//…省略getter方法

}

如果没有配置Security实例属性,那么最后结果:Security=null。如果我们想让Security={username=null,password=null,roles=[USER]},可以在Security上加上@DefaultValue。public AcmeProperties(boolean enabled, InetAddress remoteAddress, @DefaultValue Security security)

通过@EnableConfigurationProperties注册

======================================================================================================

已经定义好了JavaBean,并与配置属性绑定完成,接着需要注册这些bean。我们通常用的@Component或@Bean,@Import加载bean的方式在这里是不可取的,SpringBoot提供了解决方案: 使用@EnableConfigurationProperties ,我们既可以一一指定配置的类,也可以按照组件扫描的方式进行配置。

@SpringBootApplication

@EnableConfigurationProperties({HyhConfigurationProperties.class, MyProperties.class,AcmeProperties.class})

public class SpringBootProfileApplication {

}

@SpringBootApplication

@ConfigurationPropertiesScan({“com.hyh.config”})

public class SpringBootProfileApplication {

}

配置yaml文件

============================================================================

acme:

remote-address: 192.168.1.1

security:

username: admin

roles:

  • USER

  • ADMIN

注入properties,测试

===================================================================================

@Configuration

public class Application implements CommandLineRunner {

@Autowired

private AcmeProperties acmeProperties;

@Override

public void run(String… args) throws Exception {

System.out.println(acmeProperties);

}

}

//输出:

AcmeProperties(security=AcmeProperties.Security(username=admin, password=null, roles=[USER, ADMIN]), enabled=false, remoteAddress=/192.168.1.1)

宽松绑定

========================================================================

SpringBoot采用宽松的规则进行Environment和@ConfigurationProperties标注bean的匹配。如:

@ConfigurationProperties(prefix=“acme.my-project.person”)

public class OwnerProperties {

private String firstName;

public String getFirstName() {

return this.firstName;

}

public void setFirstName(String firstName) {

this.firstName = firstName;

}

}

下面表格中的属性名都可以匹配:

LOOK !  SpringBoot的外部化配置最全解析

@ConfigurationProperties注解中的prefix值必须是kebab case形式的,以 - 为分割符。

Spring官方建议,属性尽可能以lower-case kebab的形式:my.property-name=acme

Map如何绑定

===========================================================================

绑定到Map属性时,如果key包含 小写字母数字字符或-以外的任何其他字符 ,则需要使用方括号包围key,以便保留原始值。 如果键没有被 [] 包围,则所有非字母数字或-的字符都将被删除。如下:

hyh:

username: 天乔巴夏

password: 123456

map:

“[/key1]”: value1 #用引号包围[],用[]包围key

/key3: value3

key-4: value4

key/5: value5

结果:“map”:{/key1=value1,key5=value5, key-4=value4, key3=value3}

环境变量如何绑定

============================================================================

遵循三条原则:

  1. 把 . 换成下划线 _ 。

  2. 移除 - 。

  3. 小写转大写。

如: spring.main.log-startup-info 转为: SPRING_MAIN_LOGSTARTUPINFO , my.acme[0].other 转为 MY_ACME_0_OTHER 。

9、复杂类型

==========================================================================

之前介绍yml文件,介绍了单纯的数组形式或值的绑定,SpringBoot还支持复杂类型的绑定。

merge:

list:

  • name: 天乔巴夏

desc: 帅啊

  • name: tqbx

desc: 很帅啊

map:

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
img

最后

看完美团、字节、腾讯这三家的面试问题,是不是感觉问的特别多,可能咱们又得开启面试造火箭、工作拧螺丝的模式去准备下一次的面试了。

开篇有提及我可是足足背下了1000道题目,多少还是有点用的呢,我看了下,上面这些问题大部分都能从我背的题里找到的,所以今天给大家分享一下互联网工程师必备的面试1000题

注意不论是我说的互联网面试1000题,还是后面提及的算法与数据结构、设计模式以及更多的Java学习笔记等,皆可分享给各位朋友

最新“美团+字节+腾讯”一二三面问题,挑战一下你能走到哪一面?

互联网工程师必备的面试1000题

而且从上面三家来看,算法与数据结构是必备不可少的呀,因此我建议大家可以去刷刷这本左程云大佬著作的《程序员代码面试指南 IT名企算法与数据结构题目最优解》,里面近200道真实出现过的经典代码面试题

最新“美团+字节+腾讯”一二三面问题,挑战一下你能走到哪一面?

一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!

AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算

注意不论是我说的互联网面试1000题,还是后面提及的算法与数据结构、设计模式以及更多的Java学习笔记等,皆可分享给各位朋友

[外链图片转存中…(img-8jCoDIFw-1712174231079)]

互联网工程师必备的面试1000题

而且从上面三家来看,算法与数据结构是必备不可少的呀,因此我建议大家可以去刷刷这本左程云大佬著作的《程序员代码面试指南 IT名企算法与数据结构题目最优解》,里面近200道真实出现过的经典代码面试题

[外链图片转存中…(img-Q27z3dRa-1712174231080)]

一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!

AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算

  • 30
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值