说明:经过上文《Spring Boot是如何跑起来的》的分析,相信大家已经对Spring Boot的启动有了一定的了解。我们也知道Spring boot会在底层给我们自动配置默认值.这个时候如果我们需要修改某些配置(端口号,数据库连接信息等)应该怎么办?有什么好一点的方式去实现吗?下文将会为你解决这些疑问。
问题1:spring boot中的全局配置文件有些什么?
答:SpringBoot使用一个全局的配置文件,配置文件名是固定的,分别是:application.properties 与application.yml ;
问题2:properties 文件我知道可是yml文件又是个什么东西?
答:yml是一种以数据做为中心的标记语言,具体语法请参考下面给出的案例:
yml基本语法
- k:(空格)v:表示一对键值对(空格必须有);
- 以空格的缩进来控制层级关系;
- 只要是左对齐的一列数据,都是同一个层级的
server:
port: 8081
path: /hello
yml普通值的写法:字符串默认不用加上单引号或者双引号;
lastName: hello
age: 18
boss: false
yml对象以及Map的写法:key:value的写法 maps: {k1: v1,k2: 12}。
friends:
lastName: zhangsan
age: 20
行内写法:
friends: {lastName: zhangsan,age: 18}
yml数组的方式:用- 值表示数组中的一个元素
pets:
- cat
- dog
- pig
#行内写法
pets: [cat,dog,pig]
问题3:这个yml配置文件是如何被读取的?
答: 在spring boot中配置文件经常会与实体进行一一映射,也就是配置类啦。
yml的数据信息是通过 @ConfigurationProperties 注解来告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定,而在这个里面的 prefix = "文件名称" 属性是标识配置文件中哪个下面的所有属性进行一一映射.
在使用@ConfigurationProperties 注解时要注意,只有使用的组件是容器中的组件,才能使用容器提供的@ConfigurationProperties功能,因此一般用@Component来注入容器的。
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
private String lastName;
private Integer age;
private Boolean boss;
private Date birth;
private Map<String,Object> maps;
private List<Object> lists;
private Dog dog;
问题4:@Value与@ConfigurationProperties 的区别是什么?
使用注解的方式校验的时候要添加@Validated注解
@ConfigurationProperties | @Value | |
---|---|---|
功能 | 批量注入配置文件中的属性 | 一个个指定 |
松散绑定(松散语法驼峰转换) | 支持 | 不支持 |
SpEL(spring{表达式的形式}) | 不支持 | 支持 |
JSR303数据校验(直接用注解校验邮箱格式等) | 支持 | 不支持 |
复杂类型封装(对象,map,list等) | 支持 | 不支持 |
问题5: spring boot是如何加载自定义配置文件了?(这个配置文件是单独的properties)
答:我们经常使用某些比较独立化的模块,例如缓存Redis,他们都有自己的配置文件,但是我们为了不让主配置类有太多的独立化模块的配置文件,因此我们经常单独配置。而spring boot是通过@PropertySource(value = {"classpath:配置文件名称"})来实现外部配置文件读取注入。
Spring Boot里面没有Spring的配置文件,我们自己编写的配置文件,也不能自动识,这个对于这个外部的配置的文件我们应该如何去让这个Spring的配置文件生效呢?一般我们是直接把@ImportResource标注在入口类上 .
@ImportResource(locations = {"classpath:beans.xml"})
如果在一个项目中有很多个spring配置,那么我们使用@ImportResource注解在程序入口都添加进去了,这样会导致入口庞大还容易引起一些其他错误。
问题6: spring Boot是如何导入Spring的配置文件?
1、配置类@Configuration------> @Configuration就是指明当前类是一个配置类;就是来替代之前的Spring配置文件.
2、使用@Bean给容器中添加组件
@Configuration
public class MyAppConfig {
//将方法的返回值添加到容器中;容器中这个组件默认的id就是方法名
@Bean
public HelloService helloService02(){
System.out.println("配置类@Bean给容器中添加组件了...");
return new HelloService();
}
}
问题7:在spring Boot 中不同环境不同的配置功能如何去实现?
答:1.使用多个profile文件,然后激活指定飞配置文件。在进行对文件命名的时候文件名可以是 application-{环境}.properties 。其中程序默认使用的是application.properties的配置,如果需要激活对应的文件就例如下面代码所示。
#在配置文件中指定
spring.profiles.active=dev
2.使用yml的特性,可以用yml中 --- 来区分文本块,然后分别编写环境信息,最后激活指定环境文件。
server:
port: 8081
spring:
profiles:
active: prod
---
server:
port: 8083
spring:
profiles: dev
---
server:
port: 8084
spring:
profiles: prod
3.使用命令行的形式:java -jar xxx.jar --spring.profiles.active=dev;项目打包好以后,我们可以使用命令行参数的形式,启动项目的时候来指定配置文件的新位置;指定配置文件和默认加载的这些配置文件共同起作用形成互补配置;
4.我们经常使用把配置文件与jar放在了同一级目录,只需要运维人员修改这个文件中的一些配置就可以直接启动生效,不需要java工程师去修改配置文件。这也是命令行加载配置文件的经常用的。
问题8: properties与yml是先执行谁的?以及其他文件夹下的其他配置文件的执行顺序是什么?
答:springboot 启动会扫描以下位置的application.properties或者application.yml文件作为Spring boot的默认配置文件 ,如果这两个同时存在,默认使用的是application.properties文件,其中优先加载带环境的文件然后形成互补配置。
–file:./config/ 主配置文件所在的目录下的config文件夹下的文件
–file:./
–classpath:/config/
–classpath:/ 当前项目的根路径下