美文网首页
SpringBoot读取和使用配置文件中的数据

SpringBoot读取和使用配置文件中的数据

作者: 轻轻敲醒沉睡的心灵 | 来源:发表于2020-12-12 18:47 被阅读0次

    SpringBoot的配置信息一般是直接写在默认的配置文件(application.yml/application.properties)中的,SpringBoot自动装配的时候会加载这些数据,我们可以直接使用。但还有些情况下,我们的配置信息不放在默认的配置文件中,就需要用另外的方法来读取和使用了。

    1. 默认配置文件中的信息

    写在默认的配置文件(application.yml/application.properties)中的数据信息我们可以直接使用,使用方法我知道的有3种。

    1.1 使用@Value注解

    需要的数据比较少时,用起来比较方便,可以随时加

    public class Test {
      
        // 读取字符串
        @Value("${server.ip}")
        private String ip;
        
        // 读取整型
        @Value("${server.port}")
        private Integer port;
        
        // 属性不存在时(不包括值为空),设置默认值
        @Value("${server.password:123456}")
        private String password;
    
        public void test1() {
            System.out.println("server.ip= "+ip);
            System.out.println("server.port= "+port);
            System.out.println("server.password= "+password);
        }
    }
    

    注意:@Value 并不是所有的Spring 管理范围内都能使用,是由于它的实现机制决定的,它是AutowiredAnnotationBeanPostProcessor 实现的,它是BeanPostProcessor 接口的实现类,所以在任何BeanPostProcessor 和BeanFactoryPostProcessor 的子类中都不能使用@Value 注入属性,因为那时@Value 还未被处理

    1.2 通过Environment

    Environment是Spring通用的配置读取类,可以读取application.properties, application.yml ,命令行输入参数、系统属性、操作系统环境变量,可以通过Spring 容器自动注入,可以使用如下:

    @Configuration
    public class EnvConfig{
    
        @Autowired
        private Environment env;
    
        public int getProperties() {
            return env.getProperty("com.foo", Integer.class);
        }
    }
    

    Environment 是SpringBoot 最早初始化的一个类,因此可以使用在Spring 的任何地方

    1.3 使用@ConfigurationProperties注解

    @ConfigurationProperties是SpringBoot加入的注解,主要用于配置文件中的指定键值对映射到一个Java实体类上,一般数据信息多时,用起来方便,使用时请注意以下几点:

    • 需要添加spring-boot-configuration-processor
    • 前缀定义了哪些外部属性将绑定到类的字段上
    • 根据 SpringBoot 宽松的绑定规则,类的属性名称必须与外部属性的名称匹配
      如以下信息都将绑定到hostName属性上
      mail.hostName = localhost
      mail.hostname = localhost
      mail.host_name = localhost
      mail.host-name = localhost
      mail.HOSTNAME = localhost
      
    • 我们可以简单地用一个值初始化一个字段来定义一个默认值
    • 类的字段必须有公共 getter、setter 方法
    • @ConfigurationProperties有3种使用场景:
      • 第1种:@ConfigurationProperties@Component注解一起用到一个bean类上,使用时用@Resource先注入,如下:
        yml
        spring: 
          test:
            overTimeType: 123
        
        java类
        @ConfigurationProperties(prefix = "spring.test", ignoreUnknownFields = true)
        @Data
        @Component
        public class RuleTypeproperties {
            private String overTimeType;
        }
        
      • 第2种:@ConfigurationProperties@Bean注解一起用到一个方法上
      /**
       * @ConditionalOnProperty一般加在@Configurarion、@Component配置的类上或@Bean配置的方法上,
       * 表示满足获取到某些配置文件信息后才会配置或加载。
       * havingValue可与name组合使用:比较name获取到的属性值与havingValue给定的值是否相同,相同才加载配置
       */
      @Bean
      @ConfigurationProperties("spring.datasource.druid.slave")
      @ConditionalOnProperty(prefix = "spring.datasource.druid.slave", name = "enabled", havingValue = "true")
      public DataSource slaveDataSource() {
          return DruidDataSourceBuilder.create().build();
      }
      
      • 第3种:使用@ConfigurationProperties注解到普通类,在使用的类上通过@EnableConfigurationProperties定义为Bean
      @ConfigurationProperties(prefix = "user1")
      @Data
      public class User {
          private String name;
       }
      
      这里User对象并没有使用@Component相关注解。而该User类对应的使用形式如下:
      @SpringBootApplication
      @EnableConfigurationProperties({User.class})
      public class Application {
          public static void main(String[] args) throws Exception {
              SpringApplication.run(Application.class, args);
          }
      }
      
      上述代码中,通过@EnableConfigurationPropertiesUser进行实例化时,便会使用到@ConfigurationProperties的功能,对属性进行匹配赋值。

    注意:

    • 当我们为属性配置错误的值时,而又不希望 Spring Boot 应用启动失败,我们可以设置 ignoreInvalidFields 属性为 true (默认为 false)
    • ignoreUnknownFields 默认值是false,即当yml文件中出现了多余的字段不会报错,例子中改为了true

    2. 指定的配置文件的读取

    @PropertySource用于读取指定的配置文件,但注意这个注解默认是不支持加载YML文件,一般用properties文件
    它包含的属性解释 :
    1.value:指明加载配置文件的路径。
    2.ignoreResourceNotFound:指定的配置文件不存在是否报错,默认是false。当设置为 true 时,若该文件不存在,程序不会报错。实际项目开发中,最好设置 ignoreResourceNotFound 为 false。
    3.encoding:指定读取属性文件所使用的编码,我们通常使用的是UTF-8。
    简单示例:

    @Component
    @ConfigurationProperties(prefix = "author")
    @PropertySource(value = {"classpath:config/authorSetting.properties"},
            ignoreResourceNotFound = false, encoding = "UTF-8")
    public class AuthorTest {
     
        private String name;
        private int age;
     
    }
    

    3. 另外的

    经常使用hutool,这个工具中有Hutool-setting,使用起来也挺好的,为什么不想用@PropertySource,可能是因为经常在不经意间 中文注释 就乱码了吧,恶心

    相关文章

      网友评论

          本文标题:SpringBoot读取和使用配置文件中的数据

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