SpringBoot读取配置文件常用方法解析

网友投稿 363 2022-12-01


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 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

xmlns:xsi="http://w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://springframework.org/schema/beans http://springframework.org/schema/beans/spring-beans.xsd">

xmlns:xsi="http://w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://springframework.org/schema/beans http://springframework.org/schema/beans/spring-beans.xsd">

创建配置类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

@ToString

public 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

**/

@Configuration

public class RestTemplateConfig {

@Bean

public RestTemplateConfig reOGdlHLFFstTemplate(){

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: Oracle

server:

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

-总结 二者的一些区别

特性

@ConfigurationProperties

@Value

SpEL表达式

不支持

支持

属性松散绑定

支持

不支持

jsR303数据校验

支持

不支持

添加校验注解

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")

@Validated

public 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-clhttp://ass-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")

@Component

public class ConfigBean {

@Value("${db-typehttp://}")

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中提供了注解代替配置文件的方式来获取项目中的配置,大大简化了开发,以上总结了常用的读取配置的方法,简单来说就是两种文件(yml和properties)几大注解(@Value,@PropertySource,@Configuration,@ConfigurationProperties,@Import,@Bean);首先要了解每个注解的使用场景后,其次根据项目实际情况来具体的使用


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:解决JAVA遍历List集合,删除数据时出现的问题
下一篇:SpringBoot内部外部配置文件加载顺序解析
相关文章

 发表评论

暂时没有评论,来抢沙发吧~