SpringBoot读取配置文件常用方法解析
首先回忆一下在没有使用SpringBoot之前也就是传统的spring项目中是如何读取配置文件,通过I/O流读取指定路径的配置文件,然后再去获取指定的配置信息。
传统项目读取配置方式
读取xml配置文件
publicStringreadFromXml(StringxmlPath,Stringproperty){
SAXReaderreader=newSAXReader();
Documentdoc=null;
try{
doc=reader.read(newFile(xmlPath));
}catch(DocumentExceptione){
e.printStackTrace();
}
Iteratoriterator=doc.getRootElement().elementIterator();
while(iterator.hasNext()){
Elementelement=iterator.next();
if(element.getQName().getName().equals(property)){
returnelement.getTextTrim();
}
}
returnnull;
}
读取.properties配置文件
publicStringreadFromProperty(StringfilePath,Stringproperty){
Propertiesprop=newProperties();
try{
prop.load(newFileInputStream(filePath));
Stringvalue=prop.getProperty(property);
if(value!=null){
returnvalue;
}
}catch(IOExceptione){
e.printStackTrace();
}
returnnull;
}
SpringBoot读取配置方式
如何使用SpringBoot读取配置文件,从使用Spring慢慢演变,但是本质原理是一样的,只是SpringBoot简化配置,通过注解简化开发,接下来介绍一些常用注解。
@ImportResource注解
这个注解用来导入Spring的配置文件,是配置文件中的内容注入到配置类中,参数是一个数组,可以注入多个配置文件
代码演示:
在SpringBoot项目的resources目录下创建一个xml配置文件beans.xml
创建配置类ConfigBean
packagecom.example.test.config;
importlombok.Getter;
importlombok.Setter;
importlombok.ToString;
/**
*@authorVincente
*@date2020/07/12-12:29
*@desc配置类
**/
@Setter
@Getter
@ToString
publicclassConfigBean{
privateStringdbType;
privateStringdriverClassName;
privateStringhost;
privateStringuserName;
privateStringpassword;
}
添加@ImportResource注解,在SpringBoot项目的启动类添加
packagecom.example.test;
importorg.springframework.boot.SpringApplication;
importorg.springframework.boot.autoconfigure.SpringBootApplication;
importorg.springframework.context.annotation.ImportResource;
@SpringBootApplication
@ImportResource(locations={"classpath:beans.xml"})
publicclassTestApplication{
publicstaticvoidmain(String[]args){
SpringApplication.run(TestApplication.class,args);
}
}
测试代码
packagecom.example.test;
importcom.example.test.config.ConfigBean;
importorg.junit.jupiter.api.Test;
importorg.junit.runner.RunWith;
importorg.springframework.beans.factory.annotation.Autowired;
importorg.springframework.boot.test.context.SpringBootTest;
importorg.springframework.test.context.junit4.SpringRunner;
@SpringBootTest
@RunWith(SpringRunner.class)
classTestApplicationTests{
@Autowired
privateConfigBeanconfigBean;
@Test
voidtestConfigBean(){
System.out.println(configBean);
}
}
输出结果
ConfigBean(dbType=Oracle,driverClassName=jdbc.driver.Oracle.OracleDriver,host=127.0.0.1,userName=oracle,password=oracle)
小结@ImportResource注解可以用来加载一个外部xml文件,注入到项目完成配置,但是这样引入xml并没有达到SpringBoot简化配置的目的。
@Configuration和@Bean注解#
@Configuration和@Bean注解并不能读取配置文件中的信息,但是这两个类本身用来定义配置类
@Configuration用来代替xml文件,添加在一个类上面
@Bean用来代替bean标签,声明在方法上,方法的返回值返回一个对象到Spring的IoC容器中,方法名称相当于bean标签中的ID
代码样例
声明一个bean
importorg.springframework.context.annotation.Bean;
importorg.springframework.context.annotation.Configuration;
/**
*@authorVincente
*@date2020/07/12-13:28
*@desc
**/
@Configuration
publicclassRestTemplateConfig{
@Bean
publicRestTemplateConfigrestTemplate(){
returnnewRestTemplate();
}
}
测试代码
packagecom.example.test;
importcom.example.test.config.RestTemplateConfig;
importorg.junit.jupiter.api.Test;
importorg.junit.runner.RunWith;
importorg.springframework.boot.test.context.SpringBootTest;
importorg.springframework.test.context.junit4.SpringRunner;
importjavax.annotation.Resource;
@SpringBootTest
@RunWith(SpringRunner.class)
classTestApplicationTests{
@Resource
privateRestTemplateConfigrestTemplate;
@Test
voidtestConfigBean(){
System.out.println(restTemplate);
}
}
输出结果
com.example.test.config.RestTemplateConfig@de7e193
@Import注解
@Import注解是用来导入配置类或者一些需要前置加载的类,带有@Configuration的配置类(4.2版本之前只可以导入配置类,4.2版本之后也可以导入普通类)
代码样例
结合上面的代码做修改,不全部贴出
将RestTemplateConfigestTemplateConfig类中的@Configuration注解去掉,在ConfigBean中导入
@Setter
@Getter
@ToString
@Import(RestTemplateConfig.class)
publicclassConfigBean{
privateStringdbType;
privateStringdriverClassName;
privateStringhost;
privateStringuserName;
privateStringpassword;
}
测试代码
packagecom.example.test;
importorg.junit.jupiter.api.Test;
importorg.junit.runner.RunWith;
importorg.springframework.boot.test.context.SpringBootTest;
importorg.springframework.context.ApplicationContext;
importorg.springframework.test.context.junit4.SpringRunner;
importjavax.annotation.Resource;
@SpringBootTest
@RunWith(SpringRunner.class)
classTestApplicationTests{
@Resource
ApplicationContextctx;
@Test
voidtestConfigBean(){
System.out.println(ctx.getBean("restTemplate"));
}
}
输出结果
com.example.test.config.RestTemplateConfig@6cd15072
小结可以看到在IoC容器中已经导入了RestTemplateConfig(普通)类,这个注解类似于之前applicationContext.xml中的import标签
@ConfigurationProperties和@Value#
@ConfigurationProperties和@Value这两个注解算是在SpringBoot中用的比较多的注解了,可以在项目的配置文件application.yml和application.properties中直接读取配置,但是在用法上二者也是有一定的区别
代码样例
创建配置文件application.yml
db-config: db-type:Oracle driver-class-name:jdbc.driver.Ooracle.OracleDriver host:127.0.0.1 user-name:Oracle password:Oracle server: port:8080
创建配置类ConfigBean
packagecom.example.test.config;
importlombok.Getter;
importlombok.Setter;
importlombok.ToString;
importorg.springframework.boot.context.properties.ConfigurationProperties;
/**
*@authorVincente
*@date2020/07/12-12:29
*@desc配置类
**/
@Setter
@Getter
@ToString
@ConfigurationProperties(prefix="db-config")
publicclassConfigBean{
privateStringdbType;
privateStringdriverClassName;
privateStringhost;
privateStringuserName;
privateStringpassword;
}
测试代码
packagecom.example.test;
importcom.example.test.config.ConfigBean;
importorg.junit.jupiter.api.Test;
importorg.junit.runner.RunWith;
importorg.springframework.beans.factory.annotation.Value;
importorg.springframework.boot.test.context.SpringBootTest;
importorg.springframework.test.context.junit4.SpringRunner;
importjavax.annotation.Resource;
@SpringBootTest
@RunWith(SpringRunner.class)
classTestApplicationTests{
@Resource
ConfigBeanconfigBean;
@Value("${server.port}")
privateStringport;
@Test
voidtestConfigBean(){
System.out.println(configBean);
System.out.println(port);
}
}
输出结果
ConfigBean(dbType=Oracle,driverClassName=jdbc.driver.Ooracle.OracleDriver,host=127.0.0.1,userName=Oracle,password=Oracle)
8080
-总结二者的一些区别
| 特性 | @ConfigurationProperties | @Value |
|---|---|---|
| SpEL表达式 | 不支持 | 支持 |
| 属性松散绑定 | 支持 | 不支持 |
| JSR303数据校验 | 支持 | 不支持 |
添加校验注解
packagecom.example.test.config;
importlombok.Getter;
importlombok.Setter;
importlombok.ToString;
importorg.springframework.boot.context.properties.ConfigurationProperties;
importorg.springframework.validation.annotation.Validated;
importjavax.validation.constraints.Null;
/**
*@authorVincente
*@date2020/07/12-12:29
*@desc配置类
**/
@Setter
@Getter
@ToString
@ConfigurationProperties(prefix="db-config")
@Validated
publicclassConfigBean{
@Null
privateStringdbType;
privateStringdriverClassName;
privateStringhost;
privateStringuserName;
privateStringpassword;
}
输出结果
Description: Bindingtotargetorg.springframework.boot.context.properties.bind.BindException:Failedtobindpropertiesunder'db-config'tocom.example.test.config.ConfigBeanfailed: Property:db-config.dbType Value:Oracle Origin:classpathresource[application.yml]:2:12 Reason:必须为null
@PropertySource注解
@ConfigurationProperties和@Value这两个注解默认从项目的主配置文件中读取配置,当项目配置较多全部从一个地方读取会显得臃肿,可以将配置文件按照模块拆分读取到不同的配置类中,可以使用@PropertySource配合@Value读取其他配置文件
代码样例
创建配置文件db-config.yml
/** *@authorVincente *@date2020/07/12-14:19 *@desc **/ db-config: db-type:Oracle driver-class-name:jdbc.driver.Ooracle.OracleDriver host:127.0.0.1 user-name:Oracle password:Oracle
创建配置类ConfigBean
packagecom.example.test.config;
importlombok.Getter;
importlombok.Setter;
importlombok.ToString;
importorg.springframework.beans.factory.annotation.Value;
importorg.springframework.context.annotation.PropertySource;
importorg.springframework.stereotype.Component;
/**
*@authorVincente
*@date2020/07/12-12:29
*@desc配置类
**/
@Setter
@Getter
@ToString
@PropertySource("classpath:db-config.yml")
@Component
publicclassConfigBean{
@Value("${db-type}")
privateStringdbType;
@Value("${driver-class-name}")
privateStringdriverClassName;
@Value("${host}")
privateStringhost;
@Value("${user-name}")
privateStringuserName;
@Value("${password}")
privateStringpassword;
}
测试代码
packagecom.example.test;
importcom.example.test.config.ConfigBean;
importorg.junit.jupiter.api.Test;
importorg.junit.runner.RunWith;
importorg.springframework.beans.factory.annotation.Value;
importorg.springframework.boot.test.context.SpringBootTest;
importorg.springframework.test.context.junit4.SpringRunner;
importjavax.annotation.Resource;
@SpringBootTest
@RunWith(SpringRunner.class)
classTestApplicationTests{
@Resource
ConfigBeanconfigBean;
@Test
voidtestConfigBean(){
System.out.println(configBean);
}
}
输出结果
ConfigBean(dbType=Oracle,driverClassName=jdbc.driver.Ooracle.OracleDriver,host=127.0.0.1,userName=Vincente,password=Oracle)
小结
@PropertySource用于获取类路径下的db-config.yml配置文件,@Value用于获取yml中的配置信息,@Component注解用来将配置类交给Spring容器管理
总结
SpringBoot中提供了注解代替配置文件的方式来获取项目中的配置,大大简化了开发,以上总结了常用的读取配置的方法,简单来说就是两种文件(yml和properties)几大注解(@Value,@PropertySource,@Configuration,@ConfigurationProperties,@Import,@Bean);首先要了解每个注解的使用场景后,其次根据项目实际情况来具体的使用
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。