zoukankan      html  css  js  c++  java
  • @ConfigurationProperties、@EnableConfigurationProperties、@PropertySource的使用

    参考博客: @ConfigurationProperties 注解使用姿势,这一篇就够了

    一、注解的作用:

    @ConfigurationProperties注解的作用就是获取我们配置的参数值,这些参数一般配置在application.properties或者application.yml中。

    二、使@ConfigurationProperties生效的几种方式

    1.使用在配置类上,使用@Configuration或者@Component注解,让component scan扫描到。

    2.在java配置类中,使用@Bean返回被@ConfigurationProperties标注的配置类。

    3.使用@EnableConfigurationProperties

    三、代码:

    application.yml配置:

    server:
      port: 8080
      servlet:
        context-path: /helloSpring
    
    
    website:
      name: bianchengbang
      url: www.biancheng.net
      pets:
        - dog
        - cat
        - pig
    
    #将这些person属性全部映射到配置文件PersonProperties.java上
    person:
      lastName: 张三
      age: 18
      boss: true
      pets:
        - dog
        - cat
        - pig
    
    student:
      name: 王子奇
      age: 12
    
    teacher:
      lesson: mathematics
      gender: female

    PersonProperties.java:

    package com.cy.config;
    
    import org.springframework.boot.context.properties.ConfigurationProperties;
    import org.springframework.context.annotation.Configuration;
    
    import java.util.List;
    
    /**
     * 将配置文件中配置的每一个属性的值,映射到这个组件中
     */
    @Configuration
    @ConfigurationProperties(prefix = "person")
    public class PersonProperties {
    
        private String lastName;
    
        private Integer age = 10;               //会被application.yml中配置的属性覆盖
    
        private Boolean boss = Boolean.FALSE;   //会被application.yml中配置的属性覆盖
    
        private List<String> pets;
    
        public Integer getAge() {
            return age;
        }
    
        public void setAge(Integer age) {
            this.age = age;
        }
    
        public Boolean getBoss() {
            return boss;
        }
    
        public void setBoss(Boolean boss) {
            this.boss = boss;
        }
    
        public List<String> getPets() {
            return pets;
        }
    
        public void setPets(List<String> pets) {
            this.pets = pets;
        }
    
        public String getLastName() {
            return lastName;
        }
    
        public void setLastName(String lastName) {
            this.lastName = lastName;
        }
    }

    StudentProperties.java:

    package com.cy.config;
    
    import lombok.Data;
    import org.springframework.boot.context.properties.ConfigurationProperties;
    
    @Data
    @ConfigurationProperties(prefix = "student")
    public class StudentProperties {
    
        private String name;
    
        private Integer age;
    }

    TeacherProperties.java:

    package com.cy.config;
    
    import lombok.Data;
    import org.springframework.boot.context.properties.ConfigurationProperties;
    
    @Data
    @ConfigurationProperties(prefix = "teacher")
    public class TeacherProperties {
    
        private String lesson;
    
        private String gender;
    }

    PropertiesConfig.java:

    package com.cy.config;
    
    import org.springframework.boot.context.properties.EnableConfigurationProperties;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    /**
     * 1.使用 @EnableConfigurationProperties 注解让我们的类(TeacherProperties)被 Spring Boot 所知道,
     *   激活@ConfigurationProperties
     */
    @Configuration
    @EnableConfigurationProperties(TeacherProperties.class)
    public class PropertiesConfig {
    
        /**
         * 通过 Spring 的 Java Configuration 特性实现
         * 将StudentProperties配置属性@ConfigurationProperties激活
         */
        @Bean
        public StudentProperties studentProperties(){
            return new StudentProperties();
        }
    }

    测试代码,HelloController.java:

    package com.cy.controller;
    
    import com.cy.config.PersonProperties;
    import com.cy.config.StudentProperties;
    import com.cy.config.TeacherProperties;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.ResponseBody;
    
    import java.util.HashMap;
    import java.util.Map;
    
    @Controller
    public class HelloController {
    
        @Autowired
        private PersonProperties personProperties;
    
        @Autowired
        private StudentProperties studentProperties;
    
        @Autowired
        private TeacherProperties teacherProperties;
    
        /**
         * value: 只支持基本数据类型的封装,例如字符串、布尔值、整数等类型。
         */
        @Value("${website.name}")
        private String webSiteName;
    
        @Value("${website.url}")
        private String webSiteUrl;
    
        @ResponseBody
        @RequestMapping("/hello")
        public String hello() {
            return "Hello World!";
        }
    
        /**
         * 将personProperties javabean配置属性打印出来
         * @return
         */
        @ResponseBody
        @RequestMapping("/personProperties")
        public Map<String, Object> personProperties() {
            Map<String, Object> map = new HashMap<>();
            map.put("lastName", personProperties.getLastName());
            map.put("age", personProperties.getAge());
            map.put("isBoss", personProperties.getBoss());
            map.put("pets", personProperties.getPets());
            return map;
        }
    
        @ResponseBody
        @RequestMapping("/getStudentProps")
        public Map<String, Object> getStudentProps() {
            Map<String, Object> map = new HashMap<>();
            map.put("student name", studentProperties.getName());
            map.put("student age", studentProperties.getAge());
            return map;
        }
    
        @ResponseBody
        @RequestMapping("/getTeacherProps")
        public Map<String, Object> getTeacherProps() {
            Map<String, Object> map = new HashMap<>();
            map.put("teacher lesson", teacherProperties.getLesson());
            map.put("teacher gender", teacherProperties.getGender());
            return map;
        }
    
        @ResponseBody
        @RequestMapping("/getWebSiteProps")
        public String getWebSiteProps() {
            return "webSiteName: " + webSiteName + " webSiteUrl: " + webSiteUrl;
        }
    
    }

    测试结果:

    输入 http://localhost:8080/helloSpring/personProperties

    {"pets":["dog","cat","pig"],"lastName":"张三","isBoss":true,"age":18}

    输入 http://localhost:8080/helloSpring/getStudentProps

    {"student age":12,"student name":"王子奇"}

    输入 http://localhost:8080/helloSpring/getTeacherProps

    {"teacher lesson":"mathematics","teacher gender":"female"}

    输入 http://localhost:8080/helloSpring/getWebSiteProps

    webSiteName: bianchengbang webSiteUrl: www.biancheng.net

    四、@PropertySource使用

    如果将所有的配置都集中到 application.properties 或 application.yml 中,那么这个配置文件会十分的臃肿且难以维护,因此我们通常会将与 Spring Boot 无关的配置(例如自定义配置)提取出来,写在一个单独的配置文件中,并在对应的 JavaBean 上使用 @PropertySource 注解指向该配置文件。

     

    新建user.properties配置文件:放在classpath下面

    user.firstName=lisi
    user.age=10
    user.birthDay=2000/10/04

    UserProperties.java:

     1 package com.cy.config;
     2 
     3 import lombok.Data;
     4 import org.springframework.boot.context.properties.ConfigurationProperties;
     5 import org.springframework.context.annotation.PropertySource;
     6 import org.springframework.stereotype.Component;
     7 
     8 @PropertySource(value = "classpath:user.properties")//指向对应的配置文件
     9 @Component
    10 @ConfigurationProperties(prefix = "user")
    11 @Data
    12 public class UserProperties {
    13     private String firstName;
    14 
    15     private String age;
    16 
    17     private String birthDay;
    18 }

    HelloController.java中进行使用:

    package com.cy.controller;
    
    import com.cy.config.PersonProperties;
    import com.cy.config.StudentProperties;
    import com.cy.config.TeacherProperties;
    import com.cy.config.UserProperties;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.ResponseBody;
    
    import java.util.HashMap;
    import java.util.Map;
    
    @Controller
    public class HelloController {
    
        @Autowired
        private UserProperties userProperties;
    
    
        @ResponseBody
        @RequestMapping("/getUserProps")
        public Map<String, Object> getUserProps() {
            Map<String, Object> map = new HashMap<>();
            map.put("user name", userProperties.getFirstName());
            map.put("user age", userProperties.getAge());
            map.put("user birthDay", userProperties.getBirthDay());
            return map;
        }
    
    }

    浏览器访问:http://localhost:8080/helloSpring/getUserProps,输出:

    {"user name":"lisi","user birthDay":"2000/10/04","user age":"10"}

    五、小记  

    1.这些注解的使用,代码中的例子比较简单。更多详细使用可见看考博客。

    2.@Value的使用例子中也有,一般是在单个属性的使用中,可以看@Value和@ConfigurationProperties的区别。http://c.biancheng.net/spring_boot/config-bind.html

    ---

  • 相关阅读:
    BZOJ 2034 【2009国家集训队】 最大收益
    vijos P1780 【NOIP2012】 开车旅行
    BZOJ 2115 【WC2011】 Xor
    BZOJ 3631 【JLOI2014】 松鼠的新家
    BZOJ 4717 改装
    BZOJ 2957 楼房重建
    BZOJ 4034 【HAOI2015】 T2
    BZOJ 1834 【ZJOI2010】 network 网络扩容
    BZOJ 2440 【中山市选2011】 完全平方数
    BZOJ 2733 【HNOI2012】 永无乡
  • 原文地址:https://www.cnblogs.com/tenWood/p/15321782.html
Copyright © 2011-2022 走看看