美文网首页
springboot/springcloud配置文件知多少

springboot/springcloud配置文件知多少

作者: Angle_洛熙 | 来源:发表于2020-09-18 15:04 被阅读0次

    Spring Cloud(Spring Boot)支持Properties和YML两种配置方式。两者功能类似,但是Properties 的优先级比YML高。
    注意:

    • yml是树状结构,不支持注解@PropertySource配置
    • 如果将原有的application.properties删除,建议执行一下
    maven -X clean install
    

    配置文件application.properties

    配置文件application.properties用来配置Spring Cloud(Spring Boot)中应用程序的配置属性。
    每行结构:
    属性键=属性值
    此配置可以通过@Value注入。

    读取属性值

    • SpEL表达式
    @Value("#{configProperties['app.welcome-message']}")
    private String message;
    
    • 占位符方式
    @Value("${app.welcome-message}")
    private String message;
    

    设置默认属性

    @Value("${app.welcome-message:Hello world}")
    private String message;
    

    多行字符串

    app.config.message=12\
    幻音\
    问题
    

    数组 列表 map

    @Value("${app.config.numbers}")int[] numbers"
    
    @Value("${app.config.numbers}")List<Integer> numbers
    
    @Value("#{'${personinfo.numbers}'.split(';')}")List<Integer> numbers;
    
    app.numer-map={KEY:1;KEY2:2}
    @Value("#$app.config.numbers}'.split(';')}")List<Integer> numbers
    

    通过前缀获取配置信息

    配置文件如下:

    personinfo:
    name: zzz
    age: 3
    

    获取配置类:

    @Component
    @ConfigurationProperties(prefix = "personinfo")
    @Data
    public class GetPersonInfoProperties {
        private String name;
        private int age;
    }
    

    解释:
    @ ConfigurationProperties把配置信息自动封装成一个实体类。属性prefix表示前缀
    测试代码如下:

    @SpringBootTest
    @RunWith(SpringRunner.class)
    class ApplicationtestApplicationTests {
    
        @Autowired
        private GetPersonInfoProperties getPersonInfoProperties;
    
        @Test
        void contextLoads() {
            System.out.println(getPersonInfoProperties.getName() + getPersonInfoProperties.getAge());
        }
    

    执行结果:zzz3

    项目中配置多环境

    (1)在resources下新建三个yml文件

    application-dev.yml(测试环境),application-prod.yml(生产环境),application.yml(主配置文件)

    配置开发环境

    在application-dev.yml配置如下:

    server:
      port: 8089
      servlet:
        session:
          timeout: 30
      tomcat:
        uri-encoding: UTF-8
    

    配置生产环境

    在application-prod.yml配置如下:

    server:
      port: 8089
      servlet:
        session:
          timeout: 30
      tomcat:
        uri-encoding: UTF-8
    

    配置主配置文件

    在application.yml配置如下:

    spring:
      profiles:
        active: dev
    

    在执行代码的时候,打包后执行jar:

    java -jar XXX.jar --spring.profiles.active=dev
    

    比较配置文件bootstrap和application

    springboot(springcloud)两种配置文件: bootstrap.properties(yml)和application.properties(yml)区别:

    • (1)加载顺序。bootstrap和application是spring boot的两种上下文。Bootstrap是应用的父上下文,属于引导配置,由父ApplicationContext加载。Bootstrap优先于Application加载。
    • (2)属性是否可以被覆盖
      Bootstrap中的属性不能被远程和本地相同配置覆盖。
    • (3)Bootstrap不支持部分属性。比如:server.port
    • (4)应用场景
      Bootstrap主要用于一些固定的不能被覆盖的属性,以及加密、解密的场景
    • (5)Bootstrap和Application的上下文共用一个环境。它是所有spring应用的外部属性的来源。

    开发中遇到的问题

    @Value注入到static属性中,注入失败

    @Value一般使用在非静态属性上

    @Component
    public class Test {
      @Value("${url}")
     private String url;
    }
    

    对于静态属性注入方案:

    • 方法一
      通过xml使用bean注入
    • 方法二
      使用set方法注入
    @Component
    public class Test {
    priva static String url = "dev";
      @Value("${url}")
       public static void setUrl(String url);
           Test.url =url;
    }
    
    • 方法三
      使用中间变量
    @Component
    public class Test {
        priva static String url = "dev";
    
        @Value("${url}")
        private String tempt = "/";
    
        @PostConstruct
        public void init() {
            url = tempUrl;
    }
    

    相关文章

      网友评论

          本文标题:springboot/springcloud配置文件知多少

          本文链接:https://www.haomeiwen.com/subject/jxodyktx.html