美文网首页SpringBoot
springboot的yaml属性配置文件注入

springboot的yaml属性配置文件注入

作者: 意识流丶 | 来源:发表于2017-02-19 20:25 被阅读1335次

    SpringBoot中默认的从application.properties文件中加载参数

    我们通常把springboot中资源目录下的application.properties文件改成application.yaml,因为yaml文件更具有层次感。YAML文档也可以比较好的被支持, YamlPropertiesFactoryBean会将yaml文件当初properties来解析的。

    有时候我们会把一些属性写在配置文件yaml中然后调用

    使用@value 进行属性的注入

    这是我的yaml文件   

    写法要注意下:属性名:(空格)属性值    不够IDEA的强大功能会提示你是否写错,很明显吧,没写空格属性名是不会变色的

    新建一个测试的controller   仔细看@Value的写法 ("${上一级的属性名.属性名}")

    @RestController

    public classHelloController {

    @Value("${boy.sex}")

    private String sex;

    @Value("${boy.age}")

    private String age;

    @GetMapping("/hello")

    public String hello(){

    return sex+age;

    }

    测试的结果

    上面是直接通过@Value把属性值注入进来,在开发过程中通常不会直接在Controller中注入,通常注入会在实体类entity中

    @Component   //用于后面controller的属性注入,声明为一个bean

    public  classBoy {

    @Value("${boy.sex}")

    private String sex;

    @Value("${boy.age}")

    private String age;

    set和get方法...

    }

    controller:看起来这样写没问题,不会报错

    @RestController

    public class HelloController {

    @Autowired

    private Boy boy;

    String A=boy.getSex();

    String B=boy.getAge();

    @GetMapping("/hello")

    publicString hello(){

    return A+B;

    }

    运行后控制台报错:

    主要错误为Bean instantiation via constructor failed; nested exception is org.springframework.beans.BeanInstantiationException:大概意思是Bean通过构造函数实例化嵌套异常,异常名为org.springframework.beans.BeanInstantiationException

    怎么改呢

    需要把get方法写进方法体内

    @RestController

    public class HelloController {

    @Autowired

    private Boy boy;

    @GetMapping("/hello")

    public String hello(){

    String A=boy.getSex();

    String B=boy.getAge();

    return A+B;

    }

    再次运行,错误消失,得到我们想要的结果

    使用@ConfigurationProperties注解简化

    用@Value只要有一个属性就要写一次,但数量多了就会变得很麻烦,用@ConfigurationProperties的话会自动注入,设置要前缀prefix

    @Component

    @ConfigurationProperties(prefix ="boy")

    public  class Boy {

    private String sex;

    private String age;

    set和get方法...

    }

    注意,实体类的属性名和yaml的属性名要对应相同,不然获取到的值就为null,yaml多余的属性不影响实体类的属性

    由于你实体类只有sex和age属性,所以只会注入sex和age

    多层次的前缀prefix写法

    @ConfigurationProperties(prefix ="human.boy")

    只需要上一级的属性.下一级属性,以此类推,最底层属性要实体类entity属性

    相关文章

      网友评论

        本文标题:springboot的yaml属性配置文件注入

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