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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,826评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,968评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,234评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,562评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,611评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,482评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,271评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,166评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,608评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,814评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,926评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,644评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,249评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,866评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,991评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,063评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,871评论 2 354

推荐阅读更多精彩内容