• Springboot 就这样读配置,全部都整理好了


    今天继续写springboot,整理下零散的知识,系统化的记忆能更好的理解。

    springboot 读取配置的几种方式这个大家一般都知道,今天稍微整理下,回头看的时候也有个笔记。

    一般我们常用的有几种方式

    • 使用注解@value 读取
    • 读取单个配置文件
    • @ConfigurationProperties
    • Environment获取属性值

    下面单个详细说下

    1、使用注解@value 读取

    这个是最简单的方式,也是最省事的方式,只要在application.properties或者application.yaml中有对应的可以,就可以在bean中使用注解获取配置

    配置文件 application.properties里可以

    player.name= xiangcai

    在代码中可以这么使用,在对象实例化的时候就会注入

    1. @Value("${player.name}")
    2. public String playerName;

    注意:

    @Value 没办法注入静态变量。这个时候可以通过set 方法进行注入,在set方法上加入Value注解

    1. @RestController
    2. public class TestController {
    3. @Value("${player.name}")
    4. public String playerName;
    5. public static String staticName;
    6. @Value("${player.name}")
    7. public void setStaticName(String playerName) {
    8. staticName = playerName;
    9. }
    10. @GetMapping("/")
    11. public String test() {
    12. return staticName;
    13. }
    14. }

    最后提升一下

    1. @Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE})
    2. @Retention(RetentionPolicy.RUNTIME)
    3. @Documented
    4. public @interface Value {
    5. String value();
    6. }

    我们看下value 注解的代码,可以看到Value是可以用在很多地方,你可以测试下。

    2、@ConfigurationProperties

    这个注解也是非常好的,可以读取文件的一部分,也是我们最常使用的,自定义一些配置的时候,可以直接将配置映射为对象

    application.properties 添加下面的配置

    test.name= xiangcai test.age =19

    映射的对象定义为

    1. @Configuration
    2. @ConfigurationProperties(prefix = "test")
    3. public class TestConfig {
    4. private int age;
    5. private String name;
    6. public int getAge() {
    7. return age;
    8. }
    9. public void setAge(int age) {
    10. this.age = age;
    11. }
    12. public String getName() {
    13. return name;
    14. }
    15. public void setName(String name) {
    16. this.name = name;
    17. }
    18. }

    3、读取单个配置文件

    一般我们常规开发都是在application.yml(properties)中配置,但是有时候我们想单独起一个配置文件,读取我们自己的配置,这个时候就需要这个了

    @propertySource,看注释其实也能看明白,就是Property的地址呗

    在项目中创建一个properties,test.properties,内容如下,just for test

    player.name= xiangcai22

    看下对象的映射

    1. @PropertySource("classpath:test.yml")
    2. @Configuration
    3. @ConfigurationProperties(prefix = "player")
    4. public class PlayerConfig {
    5. private String name;
    6. public String getName() {
    7. return name;
    8. }
    9. public void setName(String name) {
    10. this.name = name;
    11. }
    12. }

    在使用的地方就可以直接使用了。

    类似下面这样

    @Autowired public PlayerConfig pc;

    4、Environment

    这个就厉害了,看名字就知道不简单,这个对象可以访问几乎你知道的环境变量

    先说下怎么用

    第一种实现 EnvironmentAware 接口,获取Environment对象保存使用就行

    第二种直接注入,通过Autowired 或者其他的

    1. @RestController
    2. public class TestController implements EnvironmentAware {
    3. Environment environment;
    4. @Override
    5. public void setEnvironment(Environment environment) {
    6. this.environment = environment;
    7. }
    8. @GetMapping("/")
    9. public String test() {
    10. return environment.getProperty("test.name");
    11. }
    12. }

    最后我们看下都有哪些东西

    我们看到我们自定义的properties都解析进去了,通过key 直接访问就行了

    总结

    1、Environment对象和 @Value在属性多的时候不方便管理,会散落到到处,不太优雅

    2、@ConfigurationProperties 直接将配置转换为bean 对象,可以统一管理一族对象,封装起来比较方便。

    3、在开发当中建议大家最好将配置封装好,读入对象使用

  • 相关阅读:
    真的要转到云IDE了吗?VS Code的开源IDE
    java 性能分析:如何提高 Java 程序的性能
    如何精准识别主数据?
    HikariPool-1 - Exception during pool initialization.
    jsp网上银行
    系统架构设计师笔记第36期:中间层架构设计
    PHP + Laravel + RabbitMQ + Redis 实现消息队列 (二) 消费队列在RabbitMQ和redis中的简单使用
    FB广告系列花费上限是否有必要设置?
    maven运行乱码,控制台运行乱码 idea,非法字符: ‘\ufeff‘需要class, interface或enum
    2022年认证杯SPSSPRO杯数学建模B题(第二阶段)唐宋诗的定量分析与比较研究求解全过程文档及程序
  • 原文地址:https://blog.csdn.net/perfect2011/article/details/125594234