SpringBoot配置加载,各配置⽂件优先级对⽐
版权声明:本⽂为CSDN博主「IT_faquir」的原创⽂章,遵循 CC 4.0 BY-SA 版权协议
原⽂链接:blog.csdn/IT_faquir/article/details/80869578
⽂章内容:
SpringBoot配置⽂件的基本使⽤;
yaml配置⽂件优先级问题讲解;
yaml配置⽂件⽬录及⽐较说明;
⾃定义配置属性;
@ConfigurationProperties与@Value两种注解对⽐;
idea⾃定义yaml配置提⽰
加载外部配置;
装配配置⽂件(properties,yaml);
引⼊xml配置⽂件。
1.SpringBoot配置⽂件
SpringBoot使⽤⼀个以application命名的配置⽂件作为默认的全局配置⽂件。⽀持properties后缀结尾的配置⽂件或者以yml/yaml后缀结尾的YAML的⽂件配置。
以设置应⽤端⼝为例:
properties⽂件⽰例(application.properties):
server.port=80
YAML⽂件⽰例(l):
server:
port: 80
两者同时存在情况
假如各配置⽂件都配置了不同的端⼝,那么SpringBoot会使⽤哪⼀个端⼝呢?带着疑问试验⼀下实例
1. 在resources⽬录下创建两个配置⽂件,⼀个为l配置⽂件,设置端⼝为8010,另⼀个为application.properties配置⽂件,设置端⼝为8020;
2. 重启系统;
3. 运⾏结果:
4.结论:可见在同⼀⽬录下,properties配置优先级 > YAML配置优先级。//所以我们在jar包启动时带上properties写法的配置可以覆盖配置
2.配置⽂件⽬录
SpringBoot配置⽂件可以放置在多种路径下,不同路径下的配置优先级有所不同。
可放置⽬录(优先级从⾼到低)
file:./config/ (当前项⽬路径config⽬录下);
file:./ (当前项⽬路径下);
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格式的拼接加载。
多种⽬录配置同时存在情况
帝国cms初见模板
接下来还是以端⼝配置为例
1. 在resources/⽬录下配置⽂件设置端⼝为8888;
2. 在resources/config⽬录下配置⽂件设置端⼝为9999;
3. 在项⽬路径下配置⽂件设置端⼝为6666;
4. 在项⽬路径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;
.
..
}
配置yaml⽂件
user:
username: admin
password: 123
或者properties⽂件
login.username=admintcp ip协议简要分析论文
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⽀持不⽀持
**松散绑定:**驼峰命名(userName)、横⼲拼接(user-name)、下划线(user_name)之间可以互相识别绑定称为做松散绑定
**JSR303:**通过@Email,@Nullable,@Digits 等等注解进⾏邮箱、判空、数字格式等等数据的校验,更多相关内容请参考IBM的中⽂⽂档:www.ibm/developerworks/cn/java/j-lo-jsr303/index.html
@ConfigurationProperties通常⽤于将配置全量注⼊某个类中;
@Value通常⽤于注⼊某⼀些特定配置值中;
⾃定义配置提⽰
在编写配置时,你会发现⾃定义配置没有提⽰,让你在使⽤⾃定义配置时变的很⿇烦,其实SpringBoot早已为我们准备好了提⽰的需要,只需要⽤引⼊相关依赖即可有提⽰。
在没有加⼊依赖时idea会有如下提⽰:
添加依赖,该idea提⽰便消失,编写⾃定义配置时也有相应提⽰:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
需要运⾏⼀下
4.指定配置⽂件
通常情况下我们将配置配置在application开头的主配置⽂件中,这样随着项⽬的增⼤配置项的增多会使⽂件变得⾮常臃肿,其实SpringBoot早已考虑到了该问题,SpringBoot提
二十六个英文字母的ascii码供了**@PropertySource和@ImportResource**两个注解⽤于加载外部配置⽂件使⽤。
@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会识别哪⼀个呢?
带着疑问,我们可以通过控制变量法进⾏测试,具体过程再在赘述。
@PropertySource(value = {"classpath:config/user1.properties","classpath:config/user2.properties"})
结论:Spring加载顺序为从左到右顺序加载,后加载的会覆盖先加载的属性值。
装配yaml配置⽂件
如果你有强迫症,⼀定想加载yaml配置⽂件,那么可以通过PropertySourcesPlaceholderConfigurer类来加载yaml⽂件,将原来的user.properties改成user.yaml,Bean配置类中加⼊如下代码,Login配置类和⼀开始的⽅式⼀致。
@Bean
js代码太长怎么换行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;
}
运⾏⼀下,仍然可以能达到加载配置效果的properties文件用什么打开
@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并勾选
continuetodo与doing的区别Transparent native-to ascill conversion(在运⾏的时候转换成ascii码)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论