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

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,可能是因为经常在不经意间 中文注释 就乱码了吧,恶心

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

友情链接更多精彩内容