name=天乔巴夏
description=${name} is my name
==========================================================================
Spring Boot不提供对加密属性值的任何内置支持,但是,它提供了 修改Spring环境中的值所必需的挂钩点。我们可以通过实现EnvironmentPostProcessor接口在应用程序启动之前操纵Environment。
可以参考 howto.html ,查看具体使用方法。
========================================================================================
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
===============================================================================
上面说到通过 @Value(“${property}”) 注解来注入配置有时会比较麻烦,特别是当多个属性本质上具有层次结构的时候。SpringBoot提供了一种解决方案: 让强类型的bean管理和验证你的配置 。
直接来看具体的使用叭:
@ConfigurationPropertie定义一个绑定配置的JavaBean
============================================================================================================
- 使用默认构造器+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。
- 通过@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 {
}
============================================================================
acme:
remote-address: 192.168.1.1
security:
username: admin
roles:
-
USER
-
ADMIN
===================================================================================
@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;
}
}
下面表格中的属性名都可以匹配:
@ConfigurationProperties注解中的prefix值必须是kebab case形式的,以 - 为分割符。
Spring官方建议,属性尽可能以lower-case kebab的形式:my.property-name=acme
===========================================================================
绑定到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}
============================================================================
遵循三条原则:
-
把 . 换成下划线 _ 。
-
移除 - 。
-
小写转大写。
如: spring.main.log-startup-info 转为: SPRING_MAIN_LOGSTARTUPINFO , my.acme[0].other 转为 MY_ACME_0_OTHER 。
==========================================================================
之前介绍yml文件,介绍了单纯的数组形式或值的绑定,SpringBoot还支持复杂类型的绑定。
merge:
list:
小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
学习分享,共勉
这里是小编拿到的学习资源,其中包括“中高级Java开发面试高频考点题笔记300道.pdf”和“Java核心知识体系笔记.pdf”文件分享,内容丰富,囊括了JVM、锁、并发、Java反射、Spring原理、微服务、Zookeeper、数据库、数据结构等大量知识点。同时还有Java进阶学习的知识笔记脑图(内含大量学习笔记)!
资料整理不易,读者朋友可以转发分享下!
Java核心知识体系笔记.pdf
中高级Java开发面试高频考点题笔记300道.pdf
架构进阶面试专题及架构学习笔记脑图
Java架构进阶学习视频分享
加下面V无偿领取!(备注Java)**
[外链图片转存中…(img-wlG8hc05-1711061012272)]
学习分享,共勉
这里是小编拿到的学习资源,其中包括“中高级Java开发面试高频考点题笔记300道.pdf”和“Java核心知识体系笔记.pdf”文件分享,内容丰富,囊括了JVM、锁、并发、Java反射、Spring原理、微服务、Zookeeper、数据库、数据结构等大量知识点。同时还有Java进阶学习的知识笔记脑图(内含大量学习笔记)!
资料整理不易,读者朋友可以转发分享下!
Java核心知识体系笔记.pdf
[外链图片转存中…(img-xf95AXq0-1711061012273)]
中高级Java开发面试高频考点题笔记300道.pdf
[外链图片转存中…(img-7XaPGc08-1711061012273)]
架构进阶面试专题及架构学习笔记脑图
[外链图片转存中…(img-3ufKtduD-1711061012274)]
Java架构进阶学习视频分享