Fork me on GitHub

SpringBoot-03-配置之注入配置文件

3.2 注入配置文件

yaml更强大的地方在于,可以给实体类直接注入匹配值!

yaml注入配置文件

  1. 在springboot项目中的resources目录下新建application.yml

  2. 编写一个实体类 Dog

    @Component
    public class Dog {
        private String name;
        private Integer age;
    }
    
  3. 思考:原来怎么给bean注入属性值,@Value

    @Component
    public class Dog {
        @Value("旺财")
        private String name;
        @Value("3")
        private Integer age;
    }
    
  4. 在SpringBoot的测试类下注入输出

    @SpringBootTest
    class Springboot02ConfigApplicationTests {
    
        @Autowired
        private Dog dog;
    
        @Test
        void contextLoads() {
            System.out.println(dog);
        }
    
    }
    
  5. 再编写一个复杂一点的实体类:Person类

    @Component
    public class Person {
        private String name;
        private Integer age;
        private boolean happy;
        private Date birth;
        private Map<String,Object> maps;
        private List<Object> lists;
        private Dog dog;
    }
    
  6. 使用yaml配置的方式进行注入,注意区别和优势

    person:
      name: huba
      age: 22
      happy: false
      birth: 2020/8/11
      maps: {k1: v1,k2: v2}
      lists:
        -code
        -music
      dog:
        name: 旺财
        age: 3
    
  7. 我们现在来注入到类中

    @Component
    @ConfigurationProperties(prefix = "person")
    public class Person {
    	...
    }
    
  8. IDEA提示,springboot配置注解处理器没有找到,我们可以查看文档,找到一个依赖!

    在这里插入图片描述

    <dependency>
    	<groupId>org.springframework.boot</groupId>
    	<artifactId>spring-boot-configuration-processor</artifactId>
    	<optional>true</optional>
    </dependency>
    
  9. 确认以上配置都ok之后,去测试类中测试一下

加载指定的配置文件

@PropertySource:加载指定的配置文件

@ConfigurationProperties:默认从全局配置文件中获取值;

  1. 在resources下新建一个person.properties

    name=huba
    
  2. 在实体类上指定加载person.properties文件

    @PropertySource(value="classpath:person.properties")
    
    //    EL表达式取值
        @Value("${name}")
    
  3. 输出测试:指定配置文件绑定成功!

    在这里插入图片描述

配置文件占位符

配置文件还可以编写占位符生成随机数

person:
  name: huba${random.uuid}
  age: ${random.int}
  happy: false
  birth: 2020/8/11
  maps: {k1: v1,k2: v2}
  lists:
    -code
    -music
  dog:
    name: ${person.hello:huba}_旺财
    age: 3

测试输出结果:

在这里插入图片描述

对比小结

在这里插入图片描述

  1. @Configuration只需要写一次即可,@Value则每个字段都需要;
  2. 松散绑定:yml中的last-name,这个和lastName是等价的,-后面的字母默认是大写的;
  3. JSR303数据校验,它就是在字段增加一层过滤器验证,可以保证数据的合法性;
  4. 复杂类型封装,yml可以封装对象;

结论:

  • 推荐yml
  • 如果只需要获取配置文件的某个值,可以使用@Value
  • 如果专门编写一个JavaBean来和配置文件一一映射,就直接@ConfigurationProperties,不要犹豫!
posted @ 2020-09-23 17:44  CodeHuba  阅读(147)  评论(0编辑  收藏  举报