zoukankan      html  css  js  c++  java
  • Spring Boot-配置

    Spring 官方完整文档:https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle
    Spring 官方配置文档:https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-external-config
    参考:https://segmentfault.com/a/1190000014206897

    Spring Boot 采用的“默认大于配置”的原则,即使没有配置,也可以使用默认配置正常启动应用。

    各种格式的配置文件

    默认全局配置文件的文件名是 application,常见的有 application.propertiesapplication.yml(YAML 格式)、application.xml(XML 格式),

    application.properties 示例:

    server.port=8081
    

    application.yml 示例:

    server:
      port: 8081
    

    application.xml 示例:

    <server>
      <port>8081</port>
    </server>
    

    类中引入配置文件

    要通过 @ConfigurationProperties 注解使用配置文件,需要先 导入依赖,IDEA 会很智能的在自动导入依赖失败时,弹出 Spring 提示的相关文档信息,根据提示操作即可。

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

    编写配置文件

    server:
      port: 8081
    
    person:
      name: kika
      age: 83
      maps:
        key1: v1
        key2: 2
      lists:
        - zhangsan
        - lisi
        - wangwu
      birth: 2011/01/01
      dog:
        name: dd
        age: 2
    

    编写 Bean 类读取配置文件

    @ConfigurationProperties(prefix = "person") 注解将当前类中的所有属性跟配置文件绑定,可以通过参数 prefix 指定前缀。配置文件的文件名必须是 application,例如 application.yml、application.properties、application-dev.yml 等。对于自定义的配置文件,需要用 @PropertySource 注解指定。

    @Component 注解将当前类添加到 Spring 容器中,从而可以使用容器的各种功能。

    @Component
    @ConfigurationProperties(prefix = "person")
    public class Person {
        private String name;
        private Integer age;
        private Date birth;
        private Map<String, Object> maps;
        private List<Object> lists;
        private Dog dog;
    
        @Override
        public String toString() {
            return "Person{" +
                    "name=" + name +
                    ", age=" + age +
                    ", birth=" + birth +
                    ", maps=" + maps +
                    ", lists=" + lists +
                    ", dog=" + dog +
                    "}";
        }
    //... getter/setter 方法
    

    编写单元测试

    在 /src/test/java/包名 下面,有 XXApplicationTests 测试类。借助测试类,可以方便的注入。

    通过这个测试类来检查刚才的配置是否加载成功:

    @RunWith(SpringRunner.class)
    @SpringBootTest
    public class DemoQuickApplicationTests {
    
        @Autowired
        Person person; // 自动关联到这个类
    
        @Test
        public void contextLoads() {
            System.out.println(person); // 测试输出
        }
    }
    

    测试文件写完后,右击运行测试类即可执行测试,查看控制台的输出即可。

    类中引入配置的某个属性

    通过 @ConfigurationProperties 引入整个配置文件,用 @Value 可以引入单个配置。@Value 注解支持3种语法:

    • 字面量,例如 true/false
    • #{SpEL} 表达式,例如 #{3+5}
    • ${key},从环境变量、配置文件中获取值
    @Value("${person.name}")
    private String name;
    
    @Value("#{11+3}")
    private Integer age;
    
    @Value("true")
    private Boolean adult;
    

    对比 @Value 和 @ConfigurationProperties 注解

    • @Value 只能一个个指定值,@ConfigurationProperties 则批量将配置文件中的属性注入类
    • @Value 支持 SpEL 表达式:@Value("#{11+3}")
    • @ConfigurationProperties 支持 JSR303 数据校验,需要引入 @Validated 注解配合,例如:
    @Component
    @ConfigurationProperties(prefix = "person")
    @Validated
    public class Person {
        @Email
        private String name; // 如果不满足邮箱校验,会报错
        //...
    

    @PropertySource 和 @ImportSource 注解

    @PropertySource 加载指定的配置文件

    如果使用了非全局配置文件,自定义了配置文件的名称,可以用 @PropertySource 注解来加载:

    
    @PropertySource(value ="classpath:person.yml")
    @Component
    @ConfigurationProperties(prefix = "person")
    public class Person {
        private String name;
        private Integer age;
        private Date birth;
        //...
    

    @ImportSource 导入 Spring 的配置文件并生效

    通过 XML 向容器添加组件

    之前都是用 XML 配置文件向容器中添加组件,有几个步骤,

    • 先写配置文件:
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    
        <bean id="helloService" class="com.kikakika.demo_quick.service.HelloService"></bean> 
    </beans>
    
    • 然后在代码中通过 @ImportSource 注解引入组件,注意这个注解要加在 Spring Boot 的启动类上:
    @ImportResource(locations = {"classpath:beans.xml"})
    @SpringBootApplication
    public class DemoQuickApplication {
        public static void main(String[] args) {
            SpringApplication.run(DemoQuickApplication.class, args);
        }
    }
    
    • 最后,写个测试用例检查一下,执行下面的 testHelloService 方法即可:
    
    @RunWith(SpringRunner.class)
    @SpringBootTest
    public class DemoQuickApplicationTests {
        @Autowired
        ApplicationContext ioc;
    
        @Test
        public void testHelloService() {
            boolean b = ioc.containsBean("helloService");
            System.out.println(b);
        }
    }
    

    @Bean 注解的方式添加组件

    Spring Boot 开始,推荐用 @Bean 注解的方式添加组件,用配置类替代配置文件:

    package com.kikakika.demo_quick.config;
    
    import com.kikakika.demo_quick.service.HelloService;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    @Configuration
    public class MyConfig {
    
        // @Bean 注解可以将方法返回值添加到容器中,容器中对应组件的默认ID就是方法名
        @Bean
        public HelloService helloService() {
            System.out.println("success add component");
            return new HelloService();
        }
    }
    

    类写完后,不需要在 Spring Boot 的启动类中引入,Spring 扫描文件后会自动引入,再执行一次上面的测试,可以看到结果。

    在配置中使用占位符

    Spring Boot 的配置文件中,可以指定占位符,会自动解析,类似格式化输出中的 %d 等,语法:

    ${prefix.key[:default-value]}
    

    例如 ${person.name:zhangsan},系统解析时找不到 person.name 属性时,会自动使用默认值 zhangsan,否则使用找到的属性。

    占位符中,有个特殊的随机值 random,可以生成随机的整型、字符串、UUID 等,例如 ${random.int}${random.uuid}

    person:
      name: kika${random.uuid}
      age: ${random.int}
      maps:
        key1: ${person.age:30}
        key2: 2
    

    不同环境使用不同的配置文件

    在开发、测试、生产环境的配置文件通常是不同的,有下面几种方式可以指定配置文件:

    • 在配置文件中指定 spring.profiles.active=dev
    • 传入命令行参数:java -jar xx.jar --spring.profiles.active=dev
    • 传入虚拟机参数:-Dspring.profiles.active=dev

    单配置文件和多配置文件

    一般会将不同环境的配置文档独立,例如:

    • 默认用 application.yml 文件
    • 测试环境使用 application-dev.yml 文件
    • 生产环境使用 application-prod.yml 文件

    Spring Boot 会默认加载 application.yml 文件,所以可以在这个文件里指定要激活使用的配置文件,例如下面例子会加载 application-dev.yml 文件:

    spring:
      profiles:
        active: dev
    

    YAML 支持多文档块,如果多个环境的配置写在一个文件中,需要在每个文档块中声明对应的环境:

    server:
      port: 8081
    spring:
      profiles:
        active: prod
        
    ---
    
    server:
      port: 8082
    spring:
      profiles: dev
      
    ---
    
    server:
      port: 8083
    spring:
      profiles: prod
    

    指定配置文件加载位置

    Spring Boot 默认支持的配置文件名为 application.properties 和 application.yml,默认会依次扫描的位置包括:

    • file:./config/:当前项目下的 config 目录下,就是 项目目录/config
    • file:./:当前项目根目录下
    • classpath:/config/:类路径的 config 目录下,就是 /src/main/resources/config
    • classpath:/:类路径的 config 目录下,就是 /src/main/resources,默认就在这里

    可以通过 spring.config.location 改变默认的配置文件位置。

    外部配置的加载顺序

    外部配置官方文档:https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-external-config

    Spring Boot 支持多种外部配置,常见的有(按优先级从高到低排列):

    • 命令行参数,优先级最高,例如 java -jar xx.jar --server.port=8088 --server.context-path=/hello
    • jar 包外部的 appplication-{profile}.properties 或 application.yml(带 spring.profile)配置文件,只要跟 jar 包在同一个目录即可生效
    • jar 包内部的 appplication-{profile}.properties 或 application.yml(带 spring.profile)配置文件
    • jar 包外部的 appplication.properties 或 application.yml(不带 spring.profile)配置文件,只要跟 jar 包在同一个目录即可生效
    • jar 包内部的 appplication.properties 或 application.yml(不带 spring.profile)配置文件
  • 相关阅读:
    【JAVA笔记——术】java枚举类使用
    【JAVA笔记——术】java枚举类使用
    【JAVA笔记——道】JAVA 基本类型内存探究
    【JAVA笔记——道】JAVA 基本类型内存探究
    【JAVA笔记——道】Hibernate 线程本地化基础篇
    Java实现HTML转PDF的总结
    JqGrid使用经验
    C# 保留小数点后两位(方法总结)
    SQL SERVER表不能修改表结构的处理方法
    C# DLL文件注册问题(涉及AxInterop.WMPLib.dll等)
  • 原文地址:https://www.cnblogs.com/kika/p/10851517.html
Copyright © 2011-2022 走看看