文章目录
- 0、模块的复制
- 1、配置文件格式
- 2、yaml语法
- 3、yaml数据读取方式
- 4、关于封装自定义对象来读取yaml配置的思考
- 4、多环境启动
- 5、配置文件分类
0、模块的复制
平时要大量创建模块时,可以直接复制模块,打开project的目录:
复制粘贴:
进入副本,修改pom文件中的Maven坐标,注意,GAV坐标必须改,name和description随便,也可以删掉,name的值就是IDEA中maven栏的模块名,当这个值为空时,则取artifactId的值
删掉多余的文件,留一个src和pom文件就行,iml文件一会儿用IDEA打开模块会重新生成。
使用IDEA打开:
成功:
1、配置文件格式
SpringBoot默认配置文件application.properties
,通过键值对配置对应属性
# 修改服务器端口
server.port=80
# 关闭运行日志图标(banner),即Spring的那个轮廓图不要了
spring.main.banner-mode=off
# 放一张自己的图做为服务启动的banner,图片放resources目录下
spring.banner.image.location=mylogo.png
#设置日志相关,默认info,debug级别太细
logging.level.root=debug
# 某个包下使用error级别的日志
logging.level.com.llg=error
SpringBoot中导入对应starter后,提供对应配置属性,书写时也出现相应的提示。更多属性及含义,可以去官网文档:https://docs.spring.io/spring-boot/docs/…
SpringBoot属性配置文件,可用properties、yml、yaml格式,常用yml文件:
当三个配置文件都存在的时候,优先级:
application.properties > application.yml > application.yaml
- 不同配置文件中相同配置按照加载优先级相互覆盖
- 不同配置文件中不同配置全部保留
关于写配置文件中的属性时,没有提示的解决方案:
打开项目结构,这次不看Moudles,选择Facets,再点击你要操作的模块名,然后点击绿叶标志的按钮
点击+,把两个yml文件的配置文件加进来:
此时,项目中yml的图标已变成了Spring配置文件的图标
可能出现的一个小Bug:
2、yaml语法
yaml文件介绍:
yaml,一种数据层序列化格式,文件扩展名为.yml(主流)和.yaml。优点:
- 以数据为核心,重数据、轻格式
- 容易与脚本语言交互
yaml文件语法:
- 大小写敏感
- 属性层级关系使用多行描述,每行结尾使用冒号结束
- 使用缩进表示层级关系,同层级左侧对齐,
只允许使用空格,不是tab
,空格数量不限 属性值前添加空格
- #表示注释
数组
数据在数据书写位置的下方使用减号做为数据开始的符号
,每行写一个数据,减号与数据间加空格
关于字面值的表示方法:
3、yaml数据读取方式
方式一: 使用@Value读取单个数据,属性名引用方式:
${一级属性名.二级属性名}
//演示下取对象数组中某个对象的属性
@Value("${users[0].age}")
private String age;
另外,在yaml配置文件内部,也可以使用dollar大括号来优化,做到一改全改:
改为:
且可以使用:来配个默认值。
addr: ${nacos-addr:nacos-headless}
当属性中出现转义字符,想让这个字符生效,必须加双引号,不加则按普通字符处理。
lesson: "Spring\tboot\nlesson"
方式二: 封装全部数据到
Environment对象
,再使用getProperty(“属性名”)
上面的方式中,想取个值,还得定义个变量去装,如此,如果一次性取多个值,岂不是乱了?==> Environment对象
,通过自动装配,将所有数据封装到Environment对象中
,取数据直接调用getProperty()
方法,如此就节约了变量的定义。
方式三: 自定义对象封装指定数据,注解+prefix属性来说明要封装哪一块数据
上面的方式用一个对象封装所有配置数据,能不能有针对性的封装呢?比如:
datasource:
driver: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/test_db
username: root
password: root123
思路大概是:
- 创建类,用来封装某一部分配置中的数据
- 由Spring去帮饿哦们加载数据到对象中,一定要告诉Spring加载哪组数据
- 使用的时候直接从Spring中获取信息使用
//注意属性名要和配置文件中的字段保持一致
@Setter
@Getter
public class MyDataSource{
private String driver;
private String url;
private String username;
private String password;
}
思考?
Spring拿到配置文件的值了,怎么给你的这个类的对象赋值? ⇒ 这个对象得受Spring控制 ⇒ 做为Bean => 加@Component
再思考?配置信息那么多字段,Spring怎么知道你要谁 ⇒ 指定要加载的数据 ⇒ @ConfigurationProperties
@Setter
@Getter
@Component
@ConfigurationProperties(prefix = "datasource")
public class MyDataSource{
private String driver;
private String url;
private String username;
private String password;
}
注入下MyDataSource这个Bean,看下属性是否都拿到了
@Autowired
private MyDataSource datasource;
4、关于封装自定义对象来读取yaml配置的思考
server:
servlet:
context-path: /test123
查看启动日志,发现tomcat的context path变了,这个数据怎么进去的?就是用封装对象的方式+@ConfigurationProperties
注解去拿的。当然这个时候你访问地址也就得变了:/访问不通了
4、多环境启动
多环境开发配置:
yml文件写法:
spring.profiles是过时写法,可改可不改:
若使用properties文件来进行多环境启动,则需要多文件,注意文件命名:
多环境启动命令行:
启动时不想使用打包时的配置,如端口被占用,默认使用dev环境,但我要连test环境:
多环境开发兼容问题:
当maven的pom文件中也配置了多环境开发,且与SpringBoot冲突,如一个默认测试,一个默认开发,此时以Maven为主:
实现兼容:
-
Maven中设置了多环境属性:
-
SpringBoot中引用Maven属性
-
此时直接打包,Maven指令执行结束后,生成jar包,但类参与了编译而配置文件没有参与编译,而是复制到包中,${}未被解析
-
此时加插件,对资源文件开启对默认占位符的解析
5、配置文件分类
问题背景:
解决思路:不同位置的application.yml文件优先级不同,在不同的场合,可以再写一个更高优先级的application.yml文件,来覆盖旧的配置