美文网首页
springboot中的分散配置

springboot中的分散配置

作者: Ukuleler | 来源:发表于2018-05-12 20:38 被阅读0次

    前言

    在实际项目中可能一个项目有很多个环境,开发环境,测试环境,生产环境等等。这些环境的一部分配置各不尽相同,如果每次更换环境都要手动一个一个改动比较麻烦。这里推荐一个分散配置的方法。

    准备

    在此之前,我们需要先复习一下springboot中的配置文件的使用。配置文件除了xml格式外主要有两种格式 .properties.ymal(yml)

    .properties属性文件,属于最常见的一种
    .yml和yaml格式的文件,则是另外一种比较简洁的配置文件

    #.properties格式
    user.Name=wzl
    user.age=18
    user.address.stree=hello
    user.my_dictionary[0].list_value_one
    user.my_dictionary[1].list_value_two
    user.my_dictionary[2].list_value_three
    
    #.yml和yaml格式
    user:
      name: wzl
      age: 18
      address:
        stree: hello
      my_dictionary:
        - list_value_one
         - list_value_two
         - list_value_three
    
    

    需要注意yml和yaml格式对缩进很严格,父节点与子节点间相差两个空格。此外每个冒号后面一定要有一个空格(以冒号结尾不需要空格,表示文件路径的模版可以不需要空格)

    可以看出yml和yaml格式相比于properties格式更加清晰,层次感更强。

    springboot配置

    step1:首先配置application.properties文件

    name=wzl
    

    step2:创建一个bean

    @Component
    public class User {
    
        private @Value("${name:aaa}") String name;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    

    step3:在controller中调用该bean

    @Slf4j
    @RestController
    @RequestMapping("/demo")
    public class HelloWorldController {
    
        @Autowired
        private User user;
    
        @GetMapping()
        @ResponseBody
        public String sayWorld(){
            log.info("username:{}",user.getName());
            return "Hello";
        }
    }
    

    启动工程,访问http://localhost:8080/demo,控制台成功输出name的值

    在这个例子中我们使用了@Value注解注入配置参数,冒号后面的是默认值(如果未获取目标配置,则取默认值)
    此外我们还可以使用占位符,统一参数

    userName=wzl
    age=${random.int[0,100]}
    remark=hello,my name is ${userName},age is ${age}
    

    @ConfigurationProperties

    为了避免每一个参数都需要写@Value注解我们还可以使用@ConfigurationProperties,具体修改为

    @Component
    @ConfigurationProperties(prefix = "user")
    public class User {
        private String name;
        private Integer age;
    }
    

    prefix参数为对应配置的匹配参数。对应的配置为

    user.name=wzl
    user.age=12
    

    实体嵌套配置

    在User中定义一个Address实体
    user.java

    @Component
    @ConfigurationProperties(prefix = "user")
    public class User {
    
        private String name;
        private Integer  age;
        private String remark;
        private String address;
        private Address detailAddress;
     }
    

    Address.java

    public class Address {
        private String country;
        private String province;
        private String city;
    }
    

    配置文件

    userName=wzl
    age=18
    remark=hello,my name is ${userName},age is ${age}
    user.address=china,hangzhou
    user.detailAddress.country=china
    user.detailAddress.province=zhejiang
    user.detailAddress.city=hangzhou
    

    这种嵌套关系如果通过yaml文件展示出来层次感会更强。

    user:
      detailAddress:
        country: china
        province: zhejiang
        city: hangzhou
    

    从这些配置中可以看出,使用@ConfigurationProperties注解,springboot会自动为我们对应上bean中相同参数名的配置。而且可以按照配置的结构对应注入(只要结构和参数名没有问题)。

    多配置文件

    说了这么多,终于说到如何分散配置了。
    我们可以通过@Profile("*")注解来调用application-*.properties的配置,springboot会自动帮我们查找这样的配置文件如application-.properties*。
    比如在启动类中,通过@Profile("development"),自动寻找application-development.properties配置。

    @Profile("development")
    @SpringBootApplication
    public class Application {
        public static void main(String[] args) {
            SpringApplication app = new SpringApplication(Application.class);
            //   app.setAdditionalProfiles("development");
            app.addListeners(new MyApplicationStartedEventListener());
            app.run(args);
        }
    }
    

    此外我们还可以新建一个主配置文件中通过spring.profiles.active来定位其他配置文件

    spring.profiles.active=development
    //这里可以不同环境相同的配置
    

    springboot会自动找到并使用application-development.properties的配置文件,我们只需要修改一个参数即可改变环境。
    在此基础上,我们还可以通过占位符

    spring.profiles.active=${environment}
    

    之后在发布阶段添加参数,比如

    java -jar application.jar environment=development 
    

    相关文章

      网友评论

          本文标题:springboot中的分散配置

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