SpringBoot如何读取配置文件
这篇文章主要讲解了SpringBoot如何读取配置文件,内容清晰明了,对此有兴趣的小伙伴可以学习一下,相信大家阅读完之后会有帮助。
首先回忆一下在没有使用SpringBoot之前也就是传统的spring项目中是如何读取配置文件,通过I/O流读取指定路径的配置文件,然后再去获取指定的配置信息。
传统项目读取配置方式#
读取xml配置文件
public String readFromXml(String xmlPath, String property) { SAXReader reader = new SAXReader(); Document doc = null; try { doc = reader.read(new File(xmlPath)); } catch (DocumentException e) { e.printStackTrace(); } Iterator<Element> iterator = doc.getRootElement().elementIterator(); while (iterator.hasNext()){ Element element = iterator.next(); if (element.getQName().getName().equals(property)){ return element.getTextTrim(); } } return null; }
读取.properties配置文件
public String readFromProperty(String filePath, String property) { Properties prop = new Properties(); try { prop.load(new FileInputStream(filePath)); String value = prop.getProperty(property); if (value != null) { return value; } } catch (IOException e) { e.printStackTrace(); } return null; }
SpringBoot读取配置方式
如何使用SpringBoot读取配置文件,从使用Spring慢慢演变,但是本质原理是一样的,只是SpringBoot简化配置,通过注解简化开发,接下来介绍一些常用注解。
@ImportResource注解
这个注解用来导入Spring的配置文件,是配置文件中的内容注入到配置类中,参数是一个数组,可以注入多个配置文件
代码演示:
在SpringBoot项目的resources目录下创建一个xml配置文件beans.xml
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="configBean" class="com.example.test.config.ConfigBean"> <property name="dbType" value="Oracle"/> <property name="driverClassName" value="jdbc.driver.Oracle.OracleDriver"/> <property name="host" value="127.0.0.1"/> <property name="userName" value="oracle"/> <property name="password" value="oracle"/> </bean></beans>
创建配置类ConfigBean
package com.example.test.config;import lombok.Getter;import lombok.Setter;import lombok.ToString;/** * @author Vincente * @date 2020/07/12-12:29 * @desc 配置类 **/@Setter@Getter@ToStringpublic class ConfigBean { private String dbType; private String driverClassName; private String host; private String userName; private String password;}
添加@ImportResource注解,在SpringBoot项目的启动类添加
package com.example.test;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.context.annotation.ImportResource;@SpringBootApplication@ImportResource(locations = {"classpath:beans.xml"})public class TestApplication { public static void main(String[] args) { SpringApplication.run(TestApplication.class, args); }}
测试代码
package com.example.test;import com.example.test.config.ConfigBean;import org.junit.jupiter.api.Test;import org.junit.runner.RunWith;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.test.context.SpringBootTest;import org.springframework.test.context.junit4.SpringRunner;@SpringBootTest@RunWith(SpringRunner.class)class TestApplicationTests { @Autowired private ConfigBean configBean; @Test void testConfigBean(){ 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
import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;/** * @author Vincente * @date 2020/07/12-13:28 * @desc **/@Configurationpublic class RestTemplateConfig { @Bean public RestTemplateConfig restTemplate(){ return new RestTemplate(); }}
测试代码
package com.example.test;import com.example.test.config.RestTemplateConfig;import org.junit.jupiter.api.Test;import org.junit.runner.RunWith;import org.springframework.boot.test.context.SpringBootTest;import org.springframework.test.context.junit4.SpringRunner;import javax.annotation.Resource;@SpringBootTest@RunWith(SpringRunner.class)class TestApplicationTests { @Resource private RestTemplateConfig restTemplate; @Test void testConfigBean(){ 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)public class ConfigBean { private String dbType; private String driverClassName; private String host; private String userName; private String password;}
测试代码
package com.example.test;import org.junit.jupiter.api.Test;import org.junit.runner.RunWith;import org.springframework.boot.test.context.SpringBootTest;import org.springframework.context.ApplicationContext;import org.springframework.test.context.junit4.SpringRunner;import javax.annotation.Resource;@SpringBootTest@RunWith(SpringRunner.class)class TestApplicationTests { @Resource ApplicationContext ctx; @Test void testConfigBean(){ 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: Oracleserver: port: 8080
创建配置类ConfigBean
package com.example.test.config;import lombok.Getter;import lombok.Setter;import lombok.ToString;import org.springframework.boot.context.properties.ConfigurationProperties;/** * @author Vincente * @date 2020/07/12-12:29 * @desc 配置类 **/@Setter@Getter@ToString@ConfigurationProperties(prefix = "db-config")public class ConfigBean { private String dbType; private String driverClassName; private String host; private String userName; private String password;}
测试代码
package com.example.test;import com.example.test.config.ConfigBean;import org.junit.jupiter.api.Test;import org.junit.runner.RunWith;import org.springframework.beans.factory.annotation.Value;import org.springframework.boot.test.context.SpringBootTest;import org.springframework.test.context.junit4.SpringRunner;import javax.annotation.Resource;@SpringBootTest@RunWith(SpringRunner.class)class TestApplicationTests { @Resource ConfigBean configBean; @Value("${server.port}") private String port; @Test void testConfigBean(){ 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
-总结 二者的一些区别
添加校验注解
package com.example.test.config;import lombok.Getter;import lombok.Setter;import lombok.ToString;import org.springframework.boot.context.properties.ConfigurationProperties;import org.springframework.validation.annotation.Validated;import javax.validation.constraints.Null;/** * @author Vincente * @date 2020/07/12-12:29 * @desc 配置类 **/@Setter@Getter@ToString@ConfigurationProperties(prefix = "db-config")@Validatedpublic class ConfigBean { @Null private String dbType; private String driverClassName; private String host; private String userName; private String password;}
输出结果
Description:Binding to target org.springframework.boot.context.properties.bind.BindException: Failed to bind properties under 'db-config' to com.example.test.config.ConfigBean failed: Property: db-config.dbType Value: Oracle Origin: class path resource [application.yml]:2:12 Reason: 必须为null
@PropertySource注解
@ConfigurationProperties和@Value这两个注解默认从项目的主配置文件中读取配置,当项目配置较多全部从一个地方读取会显得臃肿,可以将配置文件按照模块拆分读取到不同的配置类中,可以使用@PropertySource配合@Value读取其他配置文件
代码样例
创建配置文件db-config.yml
/** * @author Vincente * @date 2020/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
package com.example.test.config;import lombok.Getter;import lombok.Setter;import lombok.ToString;import org.springframework.beans.factory.annotation.Value;import org.springframework.context.annotation.PropertySource;import org.springframework.stereotype.Component;/** * @author Vincente * @date 2020/07/12-12:29 * @desc 配置类 **/@Setter@Getter@ToString@PropertySource("classpath:db-config.yml")@Componentpublic class ConfigBean { @Value("${db-type}") private String dbType; @Value("${driver-class-name}") private String driverClassName; @Value("${host}") private String host; @Value("${user-name}") private String userName; @Value("${password}") private String password;}
测试代码
package com.example.test;import com.example.test.config.ConfigBean;import org.junit.jupiter.api.Test;import org.junit.runner.RunWith;import org.springframework.beans.factory.annotation.Value;import org.springframework.boot.test.context.SpringBootTest;import org.springframework.test.context.junit4.SpringRunner;import javax.annotation.Resource;@SpringBootTest@RunWith(SpringRunner.class)class TestApplicationTests { @Resource ConfigBean configBean; @Test void testConfigBean(){ 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如何读取配置文件有进一步的了解,如果还想学习更多内容,欢迎关注亿速云行业资讯频道。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。