记录个关于springboot项目中,没法读取到自定义的yml配置文件的属性问题
1、产生问题的原因:其实是由于 jdk导致的原因,因为读取的核心注解“@PropertySource”底层调用的是jdk中的【org.springframework.util.DefaultPropertiesPersister#load() -- > java.util.Properties#load(java.io.InputStream)】方法来实现配置文件的读取
2、因此针对读取自定义的yml配置文件,可以通过扩展自定义一个“PropertySourceFactory”类,在需要替换执行的地方替换即可
3、替换的示例代码如下【核心是factory的替换】:
@Data
@Configuration
@PropertySource(value = {"classpath:customize.yml"}, factory = YamlSourceFactory.class)
@ConfigurationProperties(prefix = "customize.yml")
public class YmlProperties {
private Integer type;
private String name;
private List<Map<String, String>> ary;
}
A、额外记录个关于springboot项目中多环境的选择与优先级小结
1、SpringBoot是支持多环境的配置,通过配置属性 spring.profiles.active
来指定
2、spring.profiles.active
参数指定多个配置文件时,右边的优于左边的
3、应用外的配置文件优先于应用内,config目录下的优先于根目录下的
4、命令行参数传入时,请注意写法形同 --key=value
B、属性读取的优先级
1、根目录下的开发工具全局设置属性(当开发工具激活时为~/.spring-boot-devtools.properties)。
2、测试中的@TestPropertySource注解。
3、测试中的@SpringBootTest#properties注解特性。
4、命令行参数
5、SPRING_APPLICATION_JSON中的属性(环境变量或系统属性中的内联JSON嵌入)。
6、ServletConfig初始化参数。
7、ServletContext初始化参数。
8、java:comp/env里的JNDI属性
9、JVM系统属性
10、操作系统环境变量
11、随机生成的带random.* 前缀的属性(在设置其他属性时,可以应用他们,比如${random.long})
12、应用程序以外的application.properties或者appliaction.yml文件
13、打包在应用程序内的application.properties或者appliaction.yml文件
14、通过@PropertySource标注的属性源
15、默认属性(通过SpringApplication.setDefaultProperties指定).