0%

spring | 注解 @PropertySource

指定加载哪一个哪一个配置文件。

此注解是 Spring3.1 后提供的,并不属于 Spring Boot

另外,该注解对 *.yml 并不友好,建议使用 *.properties 文件。

当然,还有一个类似功能的注解 @PropertySources


参考资料



相关资料


一般来说,使用 @PropertySource 注解,通常需要配合下面两个注解使用。


使用


我们先看一下该注解的参数。

  • Annotation Type PropertySource

  • name

  • value

    • 用于指定资源路径,注意通配符(比如/*.properties)在这里是没有用的,路径必须明确指向到一个properties文件。因为这里value的类型是String数组,因此这里可以指定多个配置文件。
    • 单个
      • @PropertySource(value= {"classpath:redis.properties"})
    • 多个
      • @PropertySource(value= {"classpath:redis.properties","classpath:database.properties"})
  • ignoreResourceNotFound

    • 当指定的配置文件不存在是否报错,默认是false;
    • ignoreResourceNotFoundtrue的时候,程序不会报错,如果ignoreResourceNotFoundfalse的时候,程序直接报错。
  • encoding

    • 用于指定读取属性文件所使用的编码,我们通常使用的是UTF-8,默认为空。

简单的例子

一个 test.properties 文件放在 resources/config 目录里。

内容如下

1
2
my.name=resources/config/test.properties
my.age=10

在某一个 java 文件中,这样使用

1
2
3
4
5
6
7
8
@Data
@Component
@PropertySource(value = {"classpath:/config/test.properties"})
@ConfigurationProperties(prefix = "my", ignoreUnknownFields = false)
public class User {
private String name;
private int age;
}

@PropertySources


@PropertySources({ @PropertySource("classpath:redis.properties"), @PropertySource("classpath:database.properties")})

对 yml 文件的支持情况


  • spring boot 2.5.2

在这个版本下,使用该注解,对 yml 文件支持很差。

比如:

创建一个 test.yml 文件,放在 resources/config 中。指定

1
2
3
cc:
name: resources/config/test.yml
age: 15

然后,在一个类中,我这样使用。

1
2
3
4
5
6
7
8
@Data
@Component
@PropertySource(value = {"classpath:/config/test.yml"})
@ConfigurationProperties(prefix = "cc", ignoreUnknownFields = false)
public class User {
private String name;
private int age;
}

但是,最后,name 还有 age 都是 null ,也就是没有注入成功。

想要使用的话,必须加上启动参数

spring.config.location=classpath:/config/test.yml

但是,一旦加上启动参数,其他默认的加载文件也不会加载了。


spring.config.location 继续加载其他配置文件


上面那个章节,我们知道了加上 spring.config.location 指定配置文件之后,就不会再加载其他了,那么,我们依然想加载其他的怎么办。

这个时候,就是使用这个注解。

比如,即便是

spring.config.location=classpath:/config/test.yml

我们在文件中这样使用,依然会成功。

1
2
3
4
5
6
7
8
@Data
@Component
@PropertySource(value = {"classpath:/config/test.properties"})
@ConfigurationProperties(prefix = "my", ignoreUnknownFields = false)
public class User {
private String name;
private int age;
}

同时,这个的使用,也只针对 properties 文件才有效。

请我喝杯咖啡吧~