spring Boot的配置文件是如何加载的

说明:经过上文《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:/          当前项目的根路径下

 

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值