zoukankan      html  css  js  c++  java
  • SpringBoot读取配置文件以及@ConfigurationProperties和@Value区别01

    1.springboot自动配置原理

      springboot在启动的时候从类路径下META-INF/spring.factories中获取EnableAutoConfiguration指定的值,将这些值作为自动配置类导入到容器中,自动配置类就生效,帮我们进行自动配置工作,以前我们需要自己配置的,自动类都帮我们配置

    Resources文件夹中目录结构:

      static:保存所有的静态资源:js,css,image

      templates:保存所有的模板页面

    获取SpringBoot的配置文件:

      YAML语法:

        1、基本语法

        K:(空格)V:表示一对键值对(空格必须有)

      以空格的缩进来控制层级关系;只要是左对齐的一列数据,都是同一个层级

     2.值的写法

      字面量:普通的数(数字,字符串,布尔)

        字符串默认不加单引号或者双引号

        “”双引号不会转义字符串里面的特殊字符,特殊字符会作为本身要表达的意思

        ‘’单引号会转义,特殊字符最终只是一个普通的字符串数据

      对象、Map(属性和值)

        

         数组(List,Set)

          用-值表示数组中的一个元素

          

     示例:使用yml配置

    配置文件写法

            

    为了为了让写入的配置文件有提示:导入官方提示的jar包

     <!--导入配置文件处理器,配置文件进行绑定就会有提示-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-configuration-processor</artifactId>
                <optional>true</optional>
            </dependency>
    

      

    JavaBean  Person 

       @ConfigurationProperties配置文件默认写在全局的  @propertySources(value={“calsspath:person.properties”})读取指定的配置文件

     test包里测试

    @RunWith(SpringRunner.class)爆红,导入jar包
     <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.12</version>
            </dependency>  
    测试类
    @SpringBootTest
    @RunWith(SpringRunner.class)
    class SpringBootConfigApplicationTests {
        @Autowired
        Person person;
        @Test
        void contextLoads() {
            System.out.println(person);
        }
    }
    

      使用properties配置

    person.name=张三
    person.age=18
    person.birth=2017/12/15
    person.boss=false
    person.maps.k1=v1
    person.maps.k2=v2
    person.list=a,b,c
    person.dog.name=dog
    person.dog.age=15
    

      修改properties文件的编码格式为utf-8 

        

     2.获取配置文件值的第二种方式

    使用@Value获取值

    /**
     * <bean class="Person">
     *  <property name="lastName" value="字面量/${key}从环境变量,配置文件
     *  中获取值"/#{spring 的el表达式}></property>
     *  </bean>
     */
    @Component
    /*@ConfigurationProperties(prefix = "person")*/
    public class Person {
        @Value("${person.name}")
        private String name;
        @Value("#{11*2}")
        private Integer age;
        @Value("true")
        private boolean boss;
        private Date birth;
        private Map<String,Object> maps;
        private List<Object> list;
        private Dog dog;
    

      @Value获取值和@ConfigurationProperties为属性注入值对比

      @ConfigurationProperties @Value
    功能 批量注入配置文件属性 一个一个指定
    松散绑定(松散语法) 支持 不支持
    Spring的EL表达式 #{} 不支持 支持
    JSR303数据校验 支持 不支持
    复杂类型封装 支持 不支持

              如果说我们只是在某个业务逻辑中获取一个配置文件中的某项值,使用@Value,比如

        

    @RestController
    public class HelloController {
        @Value("#{person.name}")
        private String name;
        @RequestMapping("/hello")
        public String getName(){
            return "hello"+name;
        }
    }
    

      

       如果我们专门编写了一个javaBean来和配置文件进行映射,我们就直接使用@ConfigurationProperties

    JSR303数据校验:使用@Validated,要求参数必须为@Email格式,@Value不支持参数校验,校验无效

    这个就是松散结构,他们等价

    @Value不支持复杂数据类型封装

  • 相关阅读:
    单元测试
    python gdb
    圣诞树
    网络是怎样连接的 读书笔记
    POJ2104 K-th Number(整体二分)
    [SDOI2011]消耗战
    [HNOI2011]XOR和路径
    [HNOI2013]游走
    [JSOI2008]球形空间产生器
    POJ2728 Desert King
  • 原文地址:https://www.cnblogs.com/ghwq/p/12876141.html
Copyright © 2011-2022 走看看