SpringBoot学习笔记(四)配置文件,属性注入,自动配置
配置文件
yml 后缀和 propertices 后缀
语法不同
看看达成同一个目的:修改端口号, 他们分别是怎么写的
在 propertices 后缀的文件中:
在 yml 文件中
yml 写法的优点: 当配置文件中需要写的东西多起来的时候, yml 的这种结构看起来会有一种一目了然的感觉
特别注意: 这种写法与 Python 的缩进相似,被严格区分空格
当然,propertices 和 yml 的文件按照规则可以相互转换,而且,最终实现的效果一样
加载顺序
y 和 p
在 spring-boot-parent 中是这么描述的
在加载配置文件的时候, yml 比 properties 先加载
但是,如果两份文件中有相同的东西,那么,properties 中的将会覆盖 yml 中的
所以,就会出现,同时存在 properties 文件和 yml 文件时,重复项以 properties 中的配置为主的现象
而两份文件中不同的地方则会相互补充
总结起来就是:相同用 p ,不同用 y
看看下面这个例子:
我在两个文件里面分别配置了不同的端口号,最终启动的结果是这样
以 8009 端口初始化 Tomcat
其他
参考官方文档
@Profile()
用来指定某个地方使用哪个预配置文件进行解析
看下面这个实验
请先注意上面两张图 7, 14 两行不同的地方
顺路解释下这个配置文件目录的问题
注意下面两张图
resources 文件夹下面如果再建立一个 config 文件夹,则会使用到这个里面设定好的配置文件,外面那个 application.properties 呢就暂时不会用到
所以,启动的时候,会发现使用的是 8081 端口
回到实验
启动之后,打开网页,输入
在配置文件是这样时
出现这样的结果
如果将第三行改成 pro
则出现这样的结果
指定运行时使用的配置文件
在笔记(二)中运行 jar 包的基础上,在后面添加
总结
用的最多的形式,就是在 resources 这个文件夹里面放一个配置文件
属性注入
前提条件:
pom 文件中有这一段
松散绑定:
原名字:username
- USERNAME
- user-name
- user_name
- userName
以这四种方式其中一种在 yml 文件中导入数据,都可以
也就是在上图中,将 username 改成4种中其中的一种,都没问题
@ConfigurationProperties
有了上图这个,就不需要再在每个变量前面加 @Value 了
在本模块 (不是父项目)的 pom.xml 文件中插入前提条件中的那一段,还可以在设置 yml 文件中获得类似自动补全的效果
特别注意:
数组(多个值的集合),Date 类,使用下面的方式进行赋值
数组也可写成中括号的形式,像 Python 里面的列表一样
有趣的东西:
实现这个的前提是 Address 类中有 toString 函数
自动配置
官方文档里面有
这个是最傻瓜化的
https://docs.spring.io/spring-boot/docs/current/reference/html/application-properties.html#appendix.application-properties
@EnableAutoConfiguration
部分流程
最终实现扫描的时候,通过键值对的方式寻找相应的所需要的文件的路径,在 jar 包下面的 meta-inf 的文件夹中
启动自动配置类的方式
启动类上加这个@EnableAutoConfiguraion
@AutoConfigurationPackage
自动配置相关的包
@EnableConfigurationProperties()
括号里面填写的类表示,在 yml 等配置文件中,能写什么
这些配置好的东西,是怎么读取进来的?
- 通过 loadfactoriesName 这个函数调用 loadspringfactories
- loadspringfactories 读取 jar 包
- 进入 jar 包中的 meta-inf 文件夹,读取后缀为 factories 的文件
- 最后,读取的结果以 map <string, List< string > > 这种形式呈现
所以,入股需要自定义启动器,则需要在 jar 包下的 meta-inf 文件夹中加 spring.properties 文件