SpringBoot读取外部配置⽂件的⽅法
1.SpringBoot配置⽂件
2020国庆放假安排几天
SpringBoot使⽤⼀个以application命名的配置⽂件作为默认的全局配置⽂件。⽀持properties后缀结尾的配置⽂件或者以
yml/yaml后缀结尾的YAML的⽂件配置。
以设置应⽤端⼝为例
properties⽂件⽰例(application.properties):
server.port=80
YAML⽂件⽰例(l):
server:
port: 80
在properties和yml/yaml配置⽂件同时存在的情况下, 在同⼀⽬录下,properties配置优先级 > YAML(YML)配置优先级
2.配置⽂件⽬录
SpringBoot配置⽂件可以放置在多种路径下,不同路径下的配置优先级有所不同。
可放置⽬录(优先级从⾼到低)
./config/ (当前项⽬路径config⽬录下);
./ (当前项⽬路径下);
classpath:/config/ (类路径config⽬录下);
classpath:/ (类路径config下).
优先级由⾼到底,⾼优先级的配置会覆盖低优先级的配置;
SpringBoot会从这四个位置全部加载配置⽂件并互补配置;
我们可以从ConfigFileApplicationListener这类便可看出,其中DEFAULT_SEARCH_LOCATIONS属性设置了加载的⽬录:private static final String DEFAULT_SEARCH_LOCATIONS = "classpath:/,classpath:/config/,file:./,file:./config/";
接着getSearchLocations⽅法中去逗号解析成Set,其中内部类Loader负责这⼀配置⽂件的加载过程,
包括加载profile指定环境的配置,以application+’-’+name格式的拼接加载。
多种⽬录配置同时存在情况
接下来还是以端⼝配置为例
在resources/⽬录下配置⽂件设置端⼝为8888;
在resources/config⽬录下配置⽂件设置端⼝为9999;
在项⽬路径下配置⽂件设置端⼝为6666;
在项⽬路径config⽬录下配置⽂件设置端⼝为7777;
]
最终运⾏结果:
Tomcat started on port(s): 7777 (http) with context path '/beedo'
Started BeedoApplication in 4.544 seconds (JVM running for 5.335)
通过控制变量法得以论证
其优先级由⾼到底,⾼优先级的配置会覆盖低优先级的配置
3.⾃定义配置属性
SpringBoot提供了许多的配置,但通常情况我们需要⾃定义⾃⼰的配置应⽤⾃⼰的系统中,如你需要配置⼀个默认的⽤户名密码做为系统的登录⽤。
⾸先创建⼀个实体类,作为配置注⼊⽤,并使⽤@ConfigurationProperties注解进⾏批量注⼊,也可以使⽤Spring底层注解
@Value("${user.username}")的⽅式⼀个⼀个注⼊达到同意的效果
@Component
@ConfigurationProperties(prefix = "user")
public class Login{
private String username;
读取配置文件失败private String password;
...
}
或者@Value写法
@Component
public class Login{
private String username;
private String password;
.
..
}
配置⽂件写法
# yml⽂件写法
user:
username: admin
password: 123
# properties写法
login.username=admin
login.password=123
编写⼀个junit测试⽤例,看看配置的值是否正常注⼊:
@RunWith(SpringRunner.class)
@SpringBootTest
public class DeployApplicationTests {
@Autowired
private Login login;
@Test
public void contextLoads() {
System.out.println(login);
}
}
从输出结果上看,值已正常注⼊
Login{username=‘admin’, password=‘123’}
小米手机是什么@ConfigurationProperties与@Value两种注解对⽐
⽐较项@ConfigurationProperties@Value
全量注⼊⽀持不⽀持
松散绑定(Relaxed Binding)⽀持不⽀持
SpEL不⽀持⽀持
JSR303⽀持不⽀持
使⽤@ConfigurationProperties⽅式可以进⾏配置⽂件与实体字段的⾃动映射,但需要字段必须提供set⽅法才可以,⽽使⽤@Value注解修饰的字段不需要提供set⽅法
⾃定义配置提⽰
在编写配置时,你会发现⾃定义配置没有提⽰,让你在使⽤⾃定义配置时变的很⿇烦,其实SpringBoot早已为我们准备好了提⽰的需要,只需要⽤引⼊相关依赖即可有提⽰。
在没有加⼊依赖时idea会有如下提⽰:
添加依赖,该idea提⽰便消失,编写⾃定义配置时也有相应提⽰:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
需要运⾏⼀下
4.指定配置⽂件
通常情况下我们将配置配置在application开头的主配置⽂件中,这样随着项⽬的增⼤配置项的增多会使⽂件变得⾮常臃肿,其实SpringBoot早已考虑到了该问题,SpringBoot提供了@PropertySource和@ImportResource两个注解⽤于加载外部配置⽂件使⽤。2019教师培训
中秋佳节祝福短信@PropertySource通常⽤于属性加载配置⽂件,注意@PropertySource注解不⽀持加载yaml⽂件,⽀持properties⽂件。
@ImportResource通常⽤于加载Spring的xml配置⽂件
@PropertySource使⽤
装配properties配置⽂件
在sources/config下创建⼀个yaml⽂件命名为user.properties内容与上⽅user的配置⼀样
Login类可如下写法
@PropertySource(value = {"classpath:config/user.properties"})
@Component
@ConfigurationProperties(prefix = "user")
public class Login{
private String username;
private String password;
...
}
运⾏⼀下,同样能达到加载配置效果
同时加载多个配置问题
细⼼的你,会发现@PropertySource注解中属性value为⼀个数组,如果同时加载多个配置⽂件,并且不同配置⽂件中对同⼀个属性设置了不同的值,那么Spring会识别哪⼀个呢?
1986年出生是什么命带着疑问,我们可以通过控制变量法进⾏测试,具体过程再在赘述。
@PropertySource(value = {"classpath:config/user1.properties","classpath:config/user2.properties"})
结论:Spring加载顺序为从左到右顺序加载,后加载的会覆盖先加载的属性值。
装配yaml配置⽂件
如果你有强迫症,⼀定想加载yaml配置⽂件,那么可以通过PropertySourcesPlaceholderConfigurer类来加载yaml⽂件,将原来的user.properties改成user.yaml,Bean配置类中加⼊如下代码,Login配置类和⼀开始的⽅式⼀致。
@Bean
public static PropertySourcesPlaceholderConfigurer loadProperties() {
PropertySourcesPlaceholderConfigurer configurer = new PropertySourcesPlaceholderConfigurer();
YamlPropertiesFactoryBean yaml = new YamlPropertiesFactoryBean();
//yaml.setResources(new FileSystemResource("classpath:l"));//File路径引⼊
yaml.setResources(new ClassPathResource("l"));//class路径引⼊
configurer.Object());
return configurer;
}
运⾏⼀下,仍然可以能达到加载配置效果的
@ImportResource使⽤
SpringBoot提出零xml的配置,因此SpringBoot默认情况下时不会识别项⽬中Spring的xml配置⽂件。为了能够加载xml的配置⽂件,SpringBoot提供了@ImportResource注解该注解可以加载Spring的xml配置⽂件,通常加于启动类上。
@ImportResource(value = {"classpath:/l"})
@SpringBootApplication(scanBasePackages = {"team.seagull.client"})
public class DeployApplication {
public static void main(String[] args) {
SpringApplication.run(DeployApplication.class, args);
}
}
其他问题
idea使⽤.properties⽂件出现中⽂乱码问题?
idea对.properties默认编码为GBK,通常我们项⽬为UTF-8编码,这样程序在读取时就会出现乱码问题;
解决⽅法:idea 中打开如下选项File->Sttings->Editor->FileEncodings
将GBK修改为UTF-8并勾选
Transparent native-to ascill conversion(在运⾏的时候转换成ascii码)
到此这篇关于SpringBoot读取外部配置⽂件的⽅法的⽂章就介绍到这了,更多相关SpringBoot读取外部配置⽂件内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!