配置文件

在 Spring Boot 中我们抛弃了烦琐的XML文件配置,使用 application.properties 进行配置,然后在程序中即刻使用。application.properties 主要用来配置数据库连接、配置相关日志等,当然也可以自定义一些配置。

因为不再是 Spring 中原有的知识点,因此本节主要介绍如何使用配置文件,包含几种常见的使用方式。默认的 application.properties 在 src/main/resources 目录下。

配置文件的使用方式

Spring Boot 获取 application.properties 有几种方式,在这里,依旧通过实例来演示如何使用。在编写代码之前,先看 application.properties 中的内容。

database.driverName = com.mysql.jdbc.Driver
database.url=jdbc:mysql://localhost:3306/test
database.username=root
database.password=123456
  1. 可以直接读取 application.properties 的内容

    下面是测试代码。

    @SpringBootApplication
    public class IocTestDemo {
       private static final Logger log=LoggerFactory.getLogger(IocTestDemo. class);
       public static void main(String[] args) {
              ConfigurableApplicationContext context=SpringApplication. run(IocTestDemo.class, args);
          String str1=context.getEnvironment().getProperty("database. password");
          System.out.println(str1);
       }
    }

    测试结果如图4.10所示。

    image 2024 03 31 16 10 44 606
    Figure 1. 图4.10 测试结果
  2. 装配到Bean中

    在这个实例中,继续使用上文的 application.properties 中的属性值做演示。在 pojo 包下新建 DataBase 类,代码如下所示。

    package com.springBoot.ioc.pojo;
    
    @Component("database")
    public class DataBase {
       @Value("${database.username}")
       private String driverName;
       @Value("${database.url}")
       private String url;
       @Value("${database.username}")
       private String username;
       private String password;
    
       public String getDriverName() {
          return driverName;
       }
    
       public void setDriverName(String driverName) {
          this.driverName = driverName;
       }
    
       public String getUrl() {
          return url;
       }
    
       public void setUrl(String url) {
          this.url = url;
       }
    
       public String getUsername() {
          return username;
       }
    
       public void setUsername(String username) {
          this.username = username;
       }
    
       public String getPassword() {
          return password;
       }
    
       @Value("${database.password}")
       public void setPassword(String password) {
          this.password = password;
       }
    }

    在代码中,没有省略 GET 与 SET 方法,主要是这里和 SET 方法有关,需要展示一个完整的程序。这里使用 @Value 注解,然后使用 “${}” 就可以获取 application.properties 中的值。在上文中,配置文件的使用方式主要有两种,可以在类属性上直接使用,也可以在SET方法中使用,效果是一样的。下面进行验证,我们可以在 Bean 中加载属性值,测试类代码如下所示。

    package com.springBoot.ioc.test;
    /**
      * @Desciption IOC实例测试类
      */
    @SpringBootApplication
    @PropertySource("classpath:application.properties")
    public class IocTestDemo {
       private static final Logger log=LoggerFactory.getLogger(IocTestDemo. class);
       public static void main(String[] args) {
          ApplicationContext context=new AnnotationConfigApplicationCo ntext(MySpringBootConfig.class);
          DataBase dataBase=(DataBase) context.getBean("database");
          log.info("username: "+dataBase.getUsername());
          log.info("url: "+dataBase.getUrl());
       }
    }

    注意:如果继续使用以前的方式进行测试,可能 Bean 无法加载 application.properties 中的值。

    我们需要在测试类上添加 @SpringBootApplication 注解,这个注解是 @ComponentScan、@Configuration、@EnableAutoConfiguration 的统一,因此这里使用一个注解就可以了。

    在上面的代码中,我们还看到一个注解 @Property Source,用这种方式来获取指定的配置文件的属性值。建议在这里加上这个注解,因为在实验时发现缺少这个注解程序将会报错,找不到属性的值。最终的执行效果如下所示。

    09:06:01.965 [main] INFO com.springBoot.ioc.test.IocTestDemo username:root
    09:06:01.965 [main] INFO com.springBoot.ioc.test.IocTestDemo - url:jdbc:mysql://localhost:3306/test
  3. @ConfigurationProperties注解

刚才讲解的两种配置文件的使用方式,都是基于 application.properties 的。下面我们使用新的注解,这个方式可以减少很多配置。为了方便说明,Spring Boot 读取了其他配置文件,这里使用 jdbc.properties。

首先,在 sr/main/resources 下新建 jdbc.properties,代码如下所示。

jdbc.driverName = com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/test
jdbc.username=root
jdbc.password=123456

然后,在 pojo 包下新建一个 jdbc 的类,代码如下所示。

package com.springBoot.ioc.pojo;
@Component("jdbc")
@ConfigurationProperties("jdbc")
public class Jdbc {
   private String driverName;
   private String url;
   private String username;
   private String password;
   //generate getter and setter
}

上面的代码中没有使用 @Value 注解添加属性,那么如何加载到 jdbc.properties 中的配置属性?

这里就需要使用 @ConfigUrationProperties 注解,配置属性字符串 jdbc。当配置完字符串后,Spring Boot 会将利用此字符串加下面的类属性组成的全名称去对应的配置文件中读取值。例如上面的程序属性字符串 jdbc,有类属性 driverName,就可以组成 jdbc.driverName。然后,jdbc.driverName 将会从配置文件中读取,最后将值读入 Bean 中。最后进行测试,测试代码如下所示。

package com.springBoot.ioc.test;
/**
  * @Desciption IOC实例测试类
  */
@SpringBootApplication
@PropertySource("classpath:jdbc.properties")
public class IocTestDemo {
   private static final Logger log=LoggerFactory.getLogger(IocTestDemo. class);
   public static void main(String[] args) {
      ApplicationContext context=new AnnotationConfigApplicationContext(MySpringBootConfig.class);
      Jdbc jdbc=(Jdbc) context.getBean("jdbc");
      log.info("username: "+jdbc.getUsername());
      log.info("url: "+jdbc.getUrl());
   }
}

在上面的测试类代码中,要使用 @PropertySource,将需要加入的配置文件读取进应用。执行结果如下所示。

11:41:40.043 [main] INFO com.springBoot.ioc.test.IocTestDemo username: root
11:41:40.043[main]INFOcom.springBoot.ioc.test.IocTestDemo- url:jdbc:mysql://localhost:3306/test

从执行结果可以知道,jdbc.properties 中的配置项已经被添加到 Bean 中。

Yml配置文件的使用

在 Spring Boot 中不仅支持 properties 文件,也支持 Yml 文件。Yml 文件比 properties 文件更具有层次之间的关系。下面看看 Yml 文件的书写规则。

  • 大小写敏感。

  • 使用缩进表示层级关系。

  • 禁止使 Tab 缩进,只能使用空格键。

  • 缩进长度没有限制,只要元素对齐就表示这些元素属于一个层级。

  • 使用 # 表示注释。

  • 字符串可以不用引号标注。

对于更多的 Yml 书写规则,我们不再进行介绍,因为可以在网上进行查询,这里主要介绍 Spring Boot 如何使用 Yml 文件。首先,在 src/main/resources 下新建 jdbc.yml,代码如下所示。

jdbc:
  driverName: jjjj
  url: 3302

然后,在 pojo 包下新建 Jdbc 类,类的代码如所示。

package com.springBoot.ioc.pojo;

@Component("jdbc")
@ConfigurationProperties(prefix = "jdbc")
public class Jdbc {
   private String driverName;
   private String url;
   private String username;
   private String password;
   //get and set
}

在上面的代码里,与前面的 properties 用法一样,需要使用 @ConfigurationProperties 指定 yml 文件。测试代码如下所示。

package com.springBoot.ioc.test;
/**
  * @Desciption IOC实例测试类
  */
@SpringBootApplication
@PropertySource(value = "classpath:jdbc.yml",ignoreResourceNotFound= true)
public class IocTestDemo {
   private static final Logger log=LoggerFactory.getLogger(IocTestDemo. class);
   public static void main(String[] args) {
      ApplicationContext context=new AnnotationConfigApplicationCo ntext(MySpringBootConfig.class);
      Jdbc jdbc=(Jdbc) context.getBean("jdbc");
      log.info("username: "+jdbc.getUsername());
      log.info("url: "+jdbc.getUrl());
   }
}