【Spring Boot】SpringBoot 配置文件详解

本文阅读 10 分钟
首页 代码,Java 正文

整个项目中所有重要的数据都是在配置文件中配置的,比如:

  • 数据库的连接信息
  • 项目的启动端口
  • 第三方系统的调用密钥等信息
  • 用于发现和定位问题的普通日志和异常日志

除了上述的内容,还有很多重要的属性都需要在配置文件中配置。如果想要查看 Spring Boot 更多系统配置项,Spring 的官网中已经整理好了这些信息。链接如下: https://docs.spring.io/spring-boot/docs/current/reference/html/application-properties.html#application-properties

Spring Boot 配置文件主要分为两种格式:.properties 和 .yml

在创建 Spring Boot 项目时,项目默认会带一个 application.properties 配置文件

img

properties 相当于老款的配置文件,而 yml 相当于新款的配置文件,要想使用新款的配置文件,在 /src/main/resources 目录下手动创建一个 application.yml 文件就行img

补充说明:

  • 理论上 properties 和 yml 类型的配置文件可以共存,但是当这两个配置文件同时存在时,会以 properties 类型的配置文件为最高优先级,即如果这两个文件同时配置了某个属性,那么最终会使用 properties 文件的配置。当加载完 properties 类型的配置文件后,会继续加载 yml 类型的配置文件。不过并不推荐一个项目同时存在两种类型的配置文件。
  • IDEA 社区版创建好 Spring Boot 项目后,yml 配置文件默认拥有代码提示,但是 properties 配置文件没有代码提示。可以添加一个 Spring Tools 插件,解决 properties 配置文件没有代码提示的问题。

properties 是早期的配置文件的格式,也是 Spring Boot 项目创建后默认的配置文件格式。

3.1 properties 基本语法

properties 是以键值对的形式配置的,key 和 value 之间用 = 号连接。key 就是要配置的属性,value 就是要设置的值。

示例代码:

  • 配置项目的端口号 # 配置端口号
    server.port=8080
  • 配置数据库连接信息 # 配置数据库连接信息
    spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&useSSL=false

spring.datasource.username=root
spring.datasource.password=1234

可以使用 @Value 注解来读取 properties 配置文件的配置内容。读取方式为,先在注入类中创建一个相关属性,再在该属性上增加 @Value 注解,具体使用方式为 @Value(value = "${要获取的配置文件中的属性}") 或 @Value("${要获取的配置文件中的属性}")。

注意: 使用 @Value 注解获取配置文件的属性时要带 ${}。

读取示例:

@Controller
@ResponseBody
public class ReadProperties { 

    @Value(value = "${server.port}")
    private Integer port;

    @Value("${spring.datasource.url}")
    private String dbURL;

    @RequestMapping("/port")
    public Integer readPort(){ 
        return port;
    }

    @RequestMapping("/dburl")
    public String readDbURL(){ return dbURL;}
}

img

3.2 properties 配置缺点分析

properties 是以 key=value 的形式来进行配置的,会显得代码冗余。

img

yml 是 YAML(YAML Ain’t a Markup Language)的缩写,译为不是一种标记语言。yml 是一种可读性高、易于理解、用于表达数据序列化的格式。它可以用于简单表达清单(数组)、散列表、标量等数据形态。是一种专门用来写配置文件的语言,可用于多种编程语言项目的文件配置,如 Java、Go、Python、C++ 等等。

4.1 yml 基本语法

yml 是树型结构的配置文件,它的基础形式是 key: value,yml 的基础语法具有以下的规则:

  • key: value 表示键值对关系,冒号后面必须有一个空格
  • 使用空格的缩进表示层级关系,空格数目不重要,只要是左对齐的一列数据,都是同一个层级的
  • 大小写敏感

示例代码:

  • 配置项目的端口号 # 配置项目的端口号
    server:

port: 8080

  • 配置数据库的连接信息 # 配置数据库连接的信息
    spring:

datasource:

url: jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&useSSL=false
username: root
password: 1234 

4.2 yml 配置简单的数据类型及 null

yml 配置:

# 整型
value: 10

# 布尔类型
boolean.value: true

# 字符串
string:
  value1: 你好呀 \n aaa
  value2: '你好呀 \n bbb'
  value3: "你好呀 \n ccc"

# NULL
null.value: null

读取代码: 通过 @Value 注解来读取配置中的简单数据类型和 null

@Controller
@ResponseBody
public class readYml { 

    @Value("${value}")
    private int val1;

    @Value("${boolean.value}")
    private Boolean val2;

    @Value("${string.value1}")
    private String val3;

    @Value("${string.value2}")
    private String val4;

    @Value("${string.value3}")
    private String val5;

    @Value("${null.value}")
    private Object val6;

    @RequestMapping("/read")
    public void read(){ 
        System.out.println("整型 value:" + val1);
        System.out.println("整型 value:" + val2);
        System.out.println("整型 value:" + val3);
        System.out.println("整型 value:" + val4);
        System.out.println("整型 value:" + val5);
        System.out.println("整型 value:" + val6);
    }
}

img

注意: 在 yml 中,字符串如果使用了双引号包裹,那么特殊字符是不会转义的,比如 n 就表示换行;而如果字符串什么都不包裹或者用单引号包裹,那么特殊字符就会自动进行转义。

4.3 yml 配置对象

yml 配置:

# 对象(写法一)
student:
  id: 1
  name: 张三
  age: 15
  
# 对象(写法二)
user: { id: 2, username: 李四, password: 1234}

读取代码:

首先需要创建一个匹配配置文件中对象的类,并且读取配置文件中的对象就不能使用 @Value 注解,而需要使用 @ConfigurationProperties 注解,该注解放在创建的类上,并且有一个 prefix 属性用于设置配置文件中对应的 key。创建的类中必须要有 Setter 和 Getter 方法。

@Component
@ConfigurationProperties(prefix = "student")
public class Student { 
    private int id;
    private String name;
    private int age;

    public int getId() { 
        return id;
    }

    public void setId(int id) { 
        this.id = id;
    }

    public String getName() { 
        return name;
    }

    public void setName(String name) { 
        this.name = name;
    }

    public int getAge() { 
        return age;
    }

    public void setAge(int age) { 
        this.age = age;
    }

    @Override
    public String toString() { 
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

通过创建的类读取到配置文件的对象后,将该类注册到 Spring 容器中,当使用时,直接通过 @Autowired 或者 @Resource 注解注入就好。

@Controller
public class readYml { 

    @Autowired
    private Student student;

    @RequestMapping("/student")
    public void read(){ 
        System.out.println(student);
    }
}

img

4.4 yml 配置 list 集合

yml 配置:

# 集合(方式一)
dbtypes1:
  fruits:
    - 苹果
    - 菠萝
    - 西瓜

# 集合(方式二)
dbtypes2: { color: [红色,蓝色]}

读取代码:

yml 配置集合时,也需要通过 @ConfigurationProperties 注解来读取,该注解的 prefix 属性对应着上述 yml 配置的 dbtypes1 或者 dbtypes2。接下来创建一个匹配配置文件中集合的类

@Component
@ConfigurationProperties(prefix = "dbtypes1")
public class DBTypes { 
    private List<String> fruits;

    public List<String> getFruits() { 
        return fruits;
    }

    public void setFruits(List<String> fruits) { 
        this.fruits = fruits;
    }
}

通过创建的类读取到配置文件的对象后,将该类注册到 Spring 容器中,当使用时,直接通过 @Autowired 或者 @Resource 注解注入就好。

@Controller
public class readYml { 

    @Resource
    private DBTypes dbTypes;

    @RequestMapping("/dbtypes")
    public void read(){ 
        System.out.println(dbTypes.getFruits());
    }
}

img

  • properties 是以 key=value 的形式配置的键值类型的配置⽂件,⽽ yml 使⽤的是类似 json 格式的 树形配置⽅式进⾏配置的,yml 层级之间使⽤换⾏缩进的⽅式配置,key 和 value 之间使⽤“: ”英⽂ 冒号加空格的⽅式设置,并且空格不可省略。
  • properties 为早期并且默认的配置⽂件格式,但其配置存在⼀定的冗余数据,使⽤ yml 可以很好的 解决数据冗余的问题。
  • yml 通⽤性更好,⽀持更多语⾔,如 Java、Go、Python 等,如果是云服务器开发,可以使⽤⼀份 配置⽂件作为 Java 和 Go 的共同配置⽂件。
  • yml 虽然可以和 properties 共存,但⼀个项⽬中建议使⽤统⼀的配置类型⽂件。
  • yml 支持更多的数据类型

Spring Boot 中读取配置文件有以下5种方法:

  • 使用 @Value 读取配置文件
  • 使用 @ConfigurationProperties 读取配置文件
  • 使用 Environment 读取配置文件
  • 使用 @PropertySource 读取配置文件
  • 使用原生方式读取配置文件

它们的具体使用方式如下,为了方便测试,接下来将对下面的 application.yml 配置文件进行读取。

yml: 
  name: yml
  desc: configuration

6.1 使用 @Value 读取配置文件

使用 @Value 可以读取单个配置项,代码如下所示:

@Controller
@ResponseBody
public class readYml { 

    @Value("${yml.name}")
    private String name;

    @RequestMapping("/read1")
    public void read1(){ 
        System.out.println(name);
    }
}

img

6.2 使用 @ConfigurationProperties 读取配置文件

使用 @ConfigurationProperties 可以按对象或者集合的形式来读取配置项,首先先创建一个和配置中对象和集合匹配的类,然后通过@ConfigurationProperties 读取配置文件中的对象或集合,然后注入到 Spring 中,当需要使用时,通过 @Autowired 或者 @Resource 注入就可以获取到,代码如下所示:

@Component
@ConfigurationProperties(prefix = "yml")
public class Yml { 
    private String name;
    private String desc;

    public String getName() { 
        return name;
    }

    public void setName(String name) { 
        this.name = name;
    }

    public String getDesc() { 
        return desc;
    }

    public void setDesc(String desc) { 
        this.desc = desc;
    }

    @Override
    public String toString() { 
        return "Yml{" +
                "name='" + name + '\'' +
                ", desc='" + desc + '\'' +
                '}';
    }
}
@Controller
@ResponseBody
public class readYml { 

    @Autowired
    private Yml yml;

    @RequestMapping("/read2")
    public void read2(){ 
        System.out.println(yml);
    }
}

img

6.3 使用 Environment 读取配置文件

Environment 是 Spring Core 中的一个用于读取配置文件的类,将此类使用 @Autowired 或者 @Resource 注入到类中就可以使用它的 getProperty 方法来获取某个配置项的值,代码如下所示:

@Controller
@ResponseBody
public class readYml { 

    @Resource
    private Environment enviroment;

    @RequestMapping("/read3")
    public void read3(){ 
        System.out.println(enviroment.getProperty("yml.name"));
    }
}

img

6.4 使用 @PropertySource 读取配置文件

使用 @PropertySource 注解可以来指定读取某个配置文件,比如指定读取 application.yml 配置文件的内容,就可以在指定的类上添加 @PropertySource("classpath:application.yml"),代码如下所示:

@Controller
@ResponseBody
@PropertySource("classpath:application.yml")
public class readYml { 

    @Value("${yml.desc}")
    private String desc;

    @RequestMapping("/read4")
    public void read4(){ 
        System.out.println(desc);
    }
}

img

6.5 使用原生方式 Properties 对象读取配置文件

可以使用最原始的方式 Properties 对象来读取配置文件,代码如下所示: 注意: 使用原生方式读取配置文件,只支持 properties 格式的配置文件

@Controller
@ResponseBody
public class readYml { 

    @RequestMapping("/read5")
    public void read5() { 
        Properties properties = new Properties();
        InputStreamReader inputStreamReader = new InputStreamReader(
                this.getClass().getClassLoader().getResourceAsStream("application.properties"),
                StandardCharsets.UTF_8
        );
        try { 
            properties.load(inputStreamReader);
        } catch (IOException e) { 
            e.printStackTrace();
        }
        System.out.println(properties.getProperty("properties.name"));
    }
}

img

本文为互联网自动采集或经作者授权后发布,本文观点不代表立场,若侵权下架请联系我们删帖处理!文章出自:https://t4dmw.blog.csdn.net/article/details/124721650
-- 展开阅读全文 --
BUUCTF Web [极客大挑战 2019]Knife
« 上一篇 06-24
安全面试之XSS(跨站脚本攻击)
下一篇 » 07-24

发表评论

成为第一个评论的人

热门文章

标签TAG

最近回复