二、Spring Boot 基础配置(2)

本章概要

  • Properties 配置
  • 类型安全配置属性
  • YAML配置
  • Profile

2.5 Properties配置

Spring Boot中采用了大量的自动化配置,但是对于开发者而言,在实际项目中不可避免会有一些需要自己手动配置,承载这些自定义配置的文件就是resources目录下的application.properties文件(也可可以使用YAML配置来代替application.properties)。Spring Boot 项目中的application.properties 配置文件一共可以出现在如下4个位置:

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

如果4个位置都有application.properties文件,那么加载的优先级从1到4一次降低。application.yml作为配置文件也是按照以上顺序加载到Spring Environment中。指定配置文件app.properties启动jar包命令:

java -jar **.jar --spring.config.name=app

2.6 类型安全配置属性

Spring 提供了@Value注解以及EnvironmentAware接口来将Spring Environment中的数据注入到属性上,Spring Boot对此进一步提出了类型安全配置属性(Type-safe Configuration Properties),这样即使在数据量非常庞大的情况下,也可以更加方便地将配置文件中的数据注入Bean中。考虑在application.properties中添加如下配置:

book.name=斗罗大陆
book.author=唐家三少
book.price=60

将这一段配置数据注入如下Bean中:

如出现Spring Boot Configuration Annotation Processor not found in claspath,则在pom中导入如下依赖

<!--    导入配置文件处理器    -->
<dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-configuration-processor</artifactId>
      <optional>true</optional>
</dependency>
@Component
@PropertySource(value = "classpath:book.properties")
@ConfigurationProperties("book")
public class Book {
    private String name;
    private String author;
    private Float price;

    @Override
    public String toString() {
        return "Book{" +
                "name='" + name + '\'' +
                ", author='" + author + '\'' +
                ", price=" + price +
                '}';
    }

    public String getName() {
        return name;
    }

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

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public Float getPrice() {
        return price;
    }

    public void setPrice(Float price) {
        this.price = price;
    }
}

代码解释:

  • @ConfigurationProperties中的prefix属性描述了要加载的配置文件的前缀
  • 如果配置文件是一个YAML文件,那么可以将数据注入一个集合中。
  • Spring Boot采用了一种宽松的规则来进行属性绑定,如果Bean中的属性名为authorName,那么配置文件中的属性可以使 book.author_name、book.author-name、book.authorName或者book.AUTHORNAME(注意乱码问题)

创建BookController进行测试

@RestController
public class BookController {
    @Autowired
    Book book;

    @GetMapping("/book")
    public String book(){
        return book.toString();
    }
}

注入Book,并将实例数据,如图
在这里插入图片描述

在这里插入图片描述

果然还是出现乱码了,在Book类中修改@PropertySource注解属性

@PropertySource(value = "classpath:book.properties" , encoding = "UTF-8")

在这里插入图片描述

2.7 YAML配置

2.7.1 常规配置

YAML是JSON的超集,简洁而强大,是一种专门用来书写配置文件的语言,可以替代application.properties。在创建一个Spring Boot项目时,引入的spring-boot-starter-web依赖间接的引入了snakeyaml依赖,snakeyaml会实现对YAML 配置的解析。YAML 利用缩进来表示层级关系,并且大小写敏感。在Spring Boot 项目中使用YAML 只需要在resources目录下创建一个application.yml文件即可,然后添加如下配置:

server:
  port: 8081
  servlet:
    context-path: /chapter02
  tomcat:
    uri-encoding: utf-8

等效于application.properties

server.port=8081
server.servlet.context-path=/chapter01
server.tomcat.uri-encoding=utf-8

此时可以将resources目录下的application.properties文件删除,完全使用YAML完成文件的配置。(我尝试不删除这个文件,一个端口设置8081,一个设置8082,结果加载了application.properties,删除application.properties后才加载YAML的配置)

2.7.2 复杂配置

YAML不仅可以配置常规属性,也可以配置复杂属性,如下:

my:
  users:
    - name: 江南一点雨
      address: China
      favorites:
        - 足球
        - 徒步
        - Coding
    - name: sang
      address: GZ
      favorites:
        - 阅读
        - 吉他

这组配置在集合中放的是一个对象,先创建对应实体

public class User {
    private String name;
    private String address;
    private List<String> favorites;

    public String getName() {
        return name;
    }

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

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public List<String> getFavorites() {
        return favorites;
    }

    public void setFavorites(List<String> favorites) {
        this.favorites = favorites;
    }
}public class User {
    private String name;
    private String address;
    private List<String> favorites;
}

然后注入

@Component
@ConfigurationProperties(prefix = "my")
public class Users {
    private List<User> users;

    public List<User> getUsers() {
        return users;
    }

    public void setUsers(List<User> users) {
        this.users = users;
    }
}

在Spring Boot中使用YAML虽然方便,但是YAML也有一些缺陷,例如无法使用@PropertySource注解加载YAML文件,如果项目中有这种需求,还是需要使用Properties格式的配置文件。

2.8 Profile

开发者在项目发布之前,一般需要频繁地在开发环境、测试环境以及生产环境之间进行切换,这个时候大量的配置需要频繁更改,例如数据库配置、redis配置、mongodb配置、jms配置等。频繁修改带来了巨大的工作量,Spring 对此提供了解决方案(@Profile注解),Spring Boot 则更进一步提供了更加简洁的解决方案,Spring Boot 中约定的不同环境下配置文件名称规则为application-{profile}.properties,profile占位符标识当前环境的名称,具体配置步骤如下:

1.创建配置文件

首先在resources目录下创建两个配置文件:application-dev.properties 和 application-prod.properties,分别表示开发环境中的配置和生产环境中的配置。其中application-dve.properties文件的内容如下:

server.port=8081

application-prod.properties如下

server.port=8082

2. 配置application.properties

spring.profiles.active=dev

通过改变spring.profiles.active的值来切换配置文件

3. 在代码中配置

修改启动类的main方法,如下

@SpringBootApplication
public class App {
    public static void main(String[] args) {
        SpringApplicationBuilder builder = new SpringApplicationBuilder(App.class);
        builder.application().setAdditionalProfiles("dev");
        builder.run(args);
    }
}

通过setAdditionalProfiles()方法来切换配置文件

4. 项目启动配置

示例命令

java -jar **.jar --spring.profiles.active=dev
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只小熊猫呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值