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不支持复杂数据类型封装

 

posted @ 2020-05-12 14:46  西以北偏北  阅读(480)  评论(0编辑  收藏  举报