spring boot

SpringBoot学习笔记二:配置文件详解

2018-06-24  本文已影响8人  fulgens

SpringBoot全局配置文件默认为src/main/resources下的application.properties,另外它还可以重命名为.yml格式(即SpringBoot对着两种格式均支持)。

修改默认配置

如修改SpringBoot内嵌Tomcat的启动端口为9080(.yml格式)

server:
  port: 9080

启动项目即可在控制台启动日志中看到

2018-06-24 17:42:25.784  INFO 2658 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 9080 (http) with context path ''

这时在浏览器输入localhost:9080即可正常访问
Spring Boot 全部配置项 SpringBoot Common application properties

自定义属性配置

我们也可以在SpringBoot配置文件中自定义属性配置,如

com:
  example:
    girl:
      name: baby
      age: 18
      cupSize: B

然后通过@Value("${属性名}")注解来加载对应的配置属性
com/example/springbootconfiguration/controller/GirlController.java

package com.example.springbootconfiguration.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class GirlController {

    @Value("${com.example.girl.name}")
    private String girlName;

    @Value("${com.example.girl.age}")
    private Integer girlAge;

    @Value("${com.example.girl.cupSize}")
    private String girlCupSize;

    @GetMapping("/girl")
    public String getGirlInfo() {
        return "girlName: " + girlName + " girlAge: " + girlAge + " girlCupSize: " + girlCupSize;
    }

}

启动工程,访问:localhost:9080/girl,浏览器显示:

girlName: baby girlAge: 18 girlCupSize: B

属性注入成功

属性配置间的引用

在SpringBoot全局配置文件中的各个属性之间可以通过直接引用来使用

com:
  example:
    girl:
      name: baby
      age: 18
      cupSize: B
      desc: name:${com.example.girl.name} age:${com.example.girl.age} cupSize:${com.example.girl.cupSize}

同样可以使用@Value注解将girl.desc属性配置注入到某一属性中,如

package com.example.springbootconfiguration.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class GirlController {

    @Value("${com.example.girl.name}")
    private String girlName;

    @Value("${com.example.girl.age}")
    private Integer girlAge;

    @Value("${com.example.girl.cupSize}")
    private String girlCupSize;

    @Value("${com.example.girl.desc}")
    private String girlDesc;

    @GetMapping("/girl")
    public String getGirlInfo() {
        // return "girlName: " + girlName + " girlAge: " + girlAge + " girlCupSize: " + girlCupSize;
        return girlDesc;
    }

}

再次启动工程,访问:localhost:9080/girl,浏览器显示:

name:baby age:18 cupSize:B

将属性配置赋给实体类

当我们属性配置很多的时候,使用@Value注解一个一个的注入将会变得很繁琐,这时SpringBoot提供了将属性配置与实体类结合的方式,具体先来看一下SpringBoot中官方的使用如org.springframework.boot.autoconfigure.data.redis.RedisProperties

package org.springframework.boot.autoconfigure.data.redis;

import java.util.List;
import org.springframework.boot.context.properties.ConfigurationProperties;

@ConfigurationProperties(
    prefix = "spring.redis"
)
public class RedisProperties {
    private int database = 0;
    private String url;
    private String host = "localhost";
    private String password;
    private int port = 6379;
    private boolean ssl;
    private int timeout;
    private RedisProperties.Pool pool;
    private RedisProperties.Sentinel sentinel;
    private RedisProperties.Cluster cluster;
    
    ...
}

对于上面我们自己关于girl的一些配置,同理我们可以创建一个GirlProperties类,如

package com.example.springbootconfiguration.properties;

import org.springframework.boot.context.properties.ConfigurationProperties;

@Component
@ConfigurationProperties(prefix = "com.example.girl")
public class GirlProperties {

    private String name;

    private Integer age;

    private String cupSize;
    // ... getter and setters
}

当你在Idea中敲完这些代码Idea可能会提示Spring Boot Configuration Annotation Processor not found in classpath

Spring Boot Configuration Annotation Processor not found提示

点击Open Documentation会打开Generating Your Own Metadata by Using the Annotation Processor页面
嗯,主要是少了个依赖spring-boot-configuration-processor

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <optional>true</optional>
</dependency>

如何使用?在需要使用的类上加@EnableConfigurationProperties注解,同时使用@Autowired注解注入即可,如

package com.example.springbootconfiguration.controller;

import com.example.springbootconfiguration.properties.GirlProperties;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@EnableConfigurationProperties(value = {GirlProperties.class})
public class GirlController {

    @Autowired
    private GirlProperties girlProperties;

    @GetMapping("/girl2")
    public GirlProperties getGirlInfo2() {
        return girlProperties;
    }

}

再次启动工程,访问:localhost:9080/girl2,浏览器显示:


返回结果

使用随机值

Spring Boot的属性配置文件中可以通过${random}来产生随机int、long、uuid或者string字符串,来支持属性的随机值。

${random}随机值

比如我们给girl随机来个年龄

age: ${random.int}

自定义配置文件

虽然SprinBoot提供了application.properties或application.yml全局配置文件,但有时我们还是需要自定义配置文件,如将上文关于girl的属性配置提取到girl.properties文件中

girl.name: baby
girl.age: 18
girl.cupSize: B

GirlProperties2.java

package com.example.springbootconfiguration.properties;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;

@Component
@PropertySource("classpath:girl.properties")
@ConfigurationProperties(prefix = "girl")
public class GirlProperties2 {

    private String name;

    private Integer age;

    private String cupSize;

}

GirlController.java

package com.example.springbootconfiguration.controller;

import com.example.springbootconfiguration.properties.GirlProperties;
import com.example.springbootconfiguration.properties.GirlProperties2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@EnableConfigurationProperties(value = {GirlProperties.class, GirlProperties2.class})
public class GirlController {

    @Autowired
    private GirlProperties2 girlProperties2;

    @GetMapping("/girl3")
    public GirlProperties2 getGirlInfo3() {
        return girlProperties2;
    }

}

再次启动工程,访问:localhost:9080/girl3,浏览器显示:


返回结果

多环境配置

实际开发中可能会有不同的环境,有开发环境、测试环境、生成环境。对于每个环境相关配置都可能有所不同,如:数据库信息、端口配置、本地路径配置等。

如果每次切换不同环境都需要修改application.properties,那么操作是十分繁琐的。在spring boot中提供了多环境配置,使得我们切换环境变得简便。

在Spring Boot中多环境配置文件名需要满足application-{profile}.properties的格式,其中{profile}对应你的环境标识,比如:

server:
  servlet:
    context-path: /test
server:
  servlet:
    context-path: /dev
server:
  servlet:
    context-path: /prod

激活profile,在application.yml文件中通过spring.profiles.active属性来设置,其值对应{profile}值,如

spring:
  profiles:
    active: dev

这时启动应用访问localhost:9080/girl3就访问不到了,需访问localhost:9080/dev/girl3才行

用命令运行jar包启动应用的时候,可以指定相应的配置.

mvn package
java -jar target/spring-boot-configuration-0.0.1-SNAPSHOT.jar --spring.profiles..active=dev 

注:命令行参数这种jar包指定参数启动应用的方式,可能是不安全的,我们可以在启动类中设置禁止这种方式启动应用,如下:

package com.example.springbootconfiguration;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.PropertySource;

@SpringBootApplication
public class SpringBootConfigurationApplication {

    public static void main(String[] args) {
        // SpringApplication.run(SpringBootConfigurationApplication.class, args);
        SpringApplication application = new SpringApplication(SpringBootConfigurationApplication.class);
        application.setAddCommandLineProperties(false);
        application.run(args);
    }
}
上一篇 下一篇

猜你喜欢

热点阅读