Spring Boot的两种配置文件--properties VS yaml

10月份刚刚换了新工做,这也预示着全面转向Java技术栈,带着对Spring, Spring Boot, Mybatis, Maven等一切懵懂入职了新公司,领导次日就发给我一个git仓库的连接,告诉我这个咱们的项目模板,本着先让代码跑起来的原则,我去各类搜索springboot项目的基础,好在模板比较基础,能很快运行了起来,写个Controller, 链接到本地数据库也能跑通一个API,心想也挺简单嘛,看看如何跑起来的吧,因而开始研究代码,我瞬间就傻了,一下子是yaml文件,一下子是properties文件,一会又是xml配置文件,这都是干啥的,又是咋用的,能不能不写这么多配置文件,或者能不能统一用一种格式的配置文件。通过两天的研究和实验,终于大概了解各类文件的使用。 现将这些学习成果记录下来,以便后续查阅。 今天是一系列入门笔记的第一篇:Spring Boot的两种配置文件。java

虽然Spring Boot中采用了大量的自动化配置,可是在实际的项目中常常须要一些本身的配置,这时候就须要使用配置文件了,在Spring Boot中提供了两种配置文件格式----properties文件和yaml文件.默认的配置文件名称是application.properties(或application.yaml)mysql

这些配置文件放在哪

既然这些配置文件时Spring Boot默认的,那我是否是随便放到一个文件夹里就能够了, 你想多了, 固然是要按照规矩办事. Spring Boot在启动时会依此在下面的路径中寻找配置文件git

  • 项目根目录下的config文件夹
  • 项目根目录
  • classpath下的config文件夹
  • classpath下

而且四个目录的优先级从上到下依次下降, 也就是说若是你在这四个目录下都定义了配置文件, 优先级高的会将优先级低的配置覆盖. 具体以下图所示:spring

下面咱们使用数据库的配置来介绍如何使用两种不一样格式的配置文件.

application.properties 的使用

spring.datasource.name=datasource
spring.datasource.druid.filters=stat
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/springBucks?useSSL=false&useUnicode=true&characterEncoding=UTF-8
spring.datasource.username=yourusername
spring.datasource.password=yourpassword
复制代码

application.yaml 的使用

spring:
 datasource:
 name: datasource
 type: com.alibaba.druid.pool.DruidDataSource
 url: jdbc:mysql://127.0.0.1:3306/test?useSSL=false&useUnicode=true&characterEncoding=UTF-8
 driver-class-name: com.mysql.jdbc.Driver
 username: root
 password: dreamfinal21
 druid:
 filters: stat
 initial-size: 5
 min-idle: 5
 max-active: 20
 max-wait: 60000
 time-between-eviction-runs-millis: 60000
 min-evictable-idle-time-millis: 300000

复制代码

能够换个配置文件名字吗

一般默认的配置文件已经足够咱们使用了,可是有时咱们会想换一个名字, 或者是给配置文件换一个位置(我的以为不必), 这些都是能够知足的. 以下的方式均可以呀;sql

在启动时指定配置文件的名字和位置

若是你将默认配置文件自定义成app.properties, 而且将其放在自定义的classpath:/customConfig/ 下, 当你把项目打成jar包后,启动时要指定配置文件的名称和位置.数据库

java -jar properties-0.0.1-SNAPSHOT.jar --spring.config.location=classpath:/customConfig/ --spring.config.name=app
复制代码

固然在开发过程当中你也能够借助IDE指定启动项配置,这里不详细阐述,我的不喜欢这种方式,有兴趣的能够本身上网搜索一下.springboot

使用@PropertySource 注解

这里说明一下 application.properties文件是Spring Boot启动时默认会加载的配置, 一些自定义的配置是不建议写在这里面的,这时就须要写自定义的配置文件,可是自定义的配置文件默认时不会被Spring Boot加载的,这时就须要使用@PropertySource注解了. 另外须要注意的时@PeopertySource 注解是不支持yaml配置方式的.bash

下面给吃一个使用自定义的配置的实例, 这里咱们自定义了一个配置文件user.properties, 内容以下:app

user.name=zhangsan
  user.age=23
  user.id=1
复制代码
@Component
   @PropertySource("classpath:user.properties")
   public class User{
      @Value("${user.id}")
      private Long id;
      @Value("${user.name}")
      private String name;
      @Value("${user.age}")
      private Long age;
      //getter/setter
   }

复制代码

经过@PropertySource 引入自定义的配置文件的启发, 那我可否也经过该注解来加载系统配置文件呢? 因而我将application.properties文件重命名成app.properties, 并移动到classpath: /config1/下, 而后在SpringBoot启动类上加上以下注解:学习

@SpringBootApplication
  @PropertySource("classpath:config1/app.properties")
  public class SpringBucksApplication {

	public static void main(String[] args) {
		SpringApplication.run(SpringBucksApplication.class, args);
	}
  }
复制代码

哈哈, 居然也能启动

application-dev.properties或application-prod.properties 是干吗用的

在实际项目中咱们一般在不一样的环境是须要不一样的配置,好比在开发环境,测试环境已经线上环境的数据库配置可能都是不同的,你看到的application-dev.properties或application-prod.properties就是帮你解决不一样环境的配置问题的.Spring Boot约定不一样的环境配置文件的名称规则是application-{profile}.properties. 其中{profile}是一个占位符,用于表示你定义的环境名称. 使用时你能够定义不一样的环境配置文件,那我该怎么肯定我使用的时哪一个配置文件呢? 我就须要在Spring Boot的配置文件中指定激活哪个profile, 以下所示(也可使用yaml文件):

// 定义了active就使用active指定的profile, 不然使用default指定的profile,若是都不写, 那就没有profile可用啦.
spring.profile.active=dev 
spring.profile.defaut=dev
复制代码

这里还要在提一点时@Profile注解,该注解用于指定只用在某个profile激活时才装配该Bean.好比有时咱们但愿在不一样的环境下使用不一样的datasource, 此时就须要@Profile注解发挥做用了.以下示例, 咱们但愿在开发环境使用内嵌的数据库, 可是在线上环境使用MySQL数据库,咱们就能够像这样定义configuration.

@Bean(name="dataSource")
    @Profile("dev")
    public DataSource embeddedDataSource() {
      return new EmbeddedDatabaseBuilder()
              .setType(EmbeddedDatabaseType.H2)
              .addScript("classpath:schema.sql")
              .addScript("classpath:test-data.sql")
              .build();
    }

    @Bean(name="dataSource")
    @Profile("prod")
    public DataSource hikariDataSource() {

        HikariConfig hikariConfig = new HikariConfig();

        hikariConfig.setDriverClassName("com.mysql.jdbc.Driver");
        hikariConfig.setJdbcUrl(hikaricpUrl);
        hikariConfig.setUsername(hikaricpUsername);
        hikariConfig.setPassword(hikaricpPassword);
        hikariConfig.setAutoCommit(true);
        hikariConfig.setTransactionIsolation("TRANSACTION_READ_COMMITTED");
        hikariConfig.setConnectionTimeout(5000);
        hikariConfig.setIdleTimeout(600000);
        hikariConfig.setMaxLifetime(1800000);
        hikariConfig.setMaximumPoolSize(5);
        hikariConfig.addDataSourceProperty("cachePrepStmts", "true");
        hikariConfig.addDataSourceProperty("prepStmtCacheSize", "250");
        hikariConfig.addDataSourceProperty("prepStmtCacheSqlLimit", "2048");
        hikariConfig.addDataSourceProperty("allowMultiQueries", "true");

        HikariDataSource dataSource = new HikariDataSource(hikariConfig);

        return dataSource;
    }
复制代码
相关文章
相关标签/搜索