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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • SpringBoot读取properties或者application.yml配置文件中的数据

    读取application文件 在application.yml或者properties文件中添加: user.address=china user.company=demo user.name=让我康康 1.使用@Value注解读取 直接 代码如下: package im.homeapi.controller; import org.springframework.beans.factory.annotation.Value; import org.omg.CORBA.PUBLIC_MEMBE

  • 详解Spring-boot中读取config配置文件的两种方式

    了解过spring-Boot这个技术的,应该知道Spring-Boot的核心配置文件application.properties,当然也可以通过注解自定义配置文件的信息. Spring-Boot读取配置文件的方式: 一.读取核心配置文件信息application.properties的内容 核心配置文件是指在resources根目录下的application.properties或application.yml配置文件,读取这两个配置文件的方法有两种,都比较简单. 核心配置文件applicati

  • SPRINGBOOT读取PROPERTIES配置文件数据过程详解

    这篇文章主要介绍了SPRINGBOOT读取PROPERTIES配置文件数据过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一.使用@ConfigurationProperties来读取 1.Coffer entity @Configuration @ConfigurationProperties(prefix = "coffer") @PropertySource("classpath:config/coffer.p

  • Springboot读取配置文件及自定义配置文件的方法

    1.创建maven工程,在pom文件中添加依赖 <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.9.RELEASE</version> </parent> <dependencies> <dependency

  • Spring Boot的properties配置文件读取

    我在自己写点东西玩的时候需要读配置文件,又不想引包,于是打算扣点Spring Boot读取配置文件的代码出来,当然只是读配置文件没必要这么麻烦,不过反正闲着也是闲着,扣着玩了. 具体启动过程以前的博客写过Spring Boot启动过程(一),这次入口在SpringApplication类中: private ConfigurableEnvironment prepareEnvironment( SpringApplicationRunListeners listeners, Applicatio

  • springboot如何读取配置文件(application.yml)中的属性值

    在spring boot中,简单几步,读取配置文件(application.yml)中各种不同类型的属性值: 1.引入依赖: <!-- 支持 @ConfigurationProperties 注解 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId>

  • 如何解决springboot读取配置文件的中文乱码问题

    在application.properties中填写中文信息,在读取该文件时会出现中文乱码问题. 比如:application.properties内容: student.name=小康 student.age=15 解决方法:我用的是IDEA,首先File->settings->Code style->File Encoding 把所有的编码都设为UTF-8就好了. 再次运行,得出正常结果: 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们.

  • springboot读取配置文件中的参数具体步骤

    springBoot是java开发中会经常用到的框架,那么在实际项目中项目配置了springBoot框架,应该如何在项目中读取配置文件中的参数呢? 1.打开eclipse开发工具软件. 2.在项目中确保pom.xml文件已引用了[spring-boot-starter-web]jar包. 因为springBoot启动的时候会自动去获取项目中在resources文件录目下的名为application.properties参数配置文件. 3.在项目中的src/main/resource文件录目下创建

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

  • 详解SpringBoot读取配置文件的N种方法

    我们在项目开发中经常会用到配置信息,例如数据库连接的帐号.密码等,而为了方便维护,我们通常将这些信息放到配置文件中.在需要用到这些配置信息时,可以通过代码获取.下面我们看看Spring中有哪些获取配置信息的方法. PropertiesLoaderUtils读取 通过ClassPathResource加载配置文件资源,结合PropertiesLoaderUtils类读取,源码如下: ClassPathResource resource = new ClassPathResource("applic

  • SpringBoot读取配置文件的五种方法总结

    目录 1.使用 @Value 读取配置文件 2.使用 @ConfigurationProperties 读取配置文件 3.使用 Environment 读取配置文件 4.使用 @PropertySource 读取配置文件 中文乱码 注意事项 5.使用原生方式读取配置文件 总结 Spring Boot 中读取配置文件有以下 5 种方法: 使用 @Value 读取配置文件. 使用 @ConfigurationProperties 读取配置文件. 使用 Environment 读取配置文件. 使用 @

  • SpringBoot如何读取配置文件中的数据到map和list

    目录 读取配置文件中的数据到map和list springboot读取配置文件中的配置信息到map springboot读取配置文件中的配置信息到list 测试上述配置是否有效 配置文件的读取(包括list.map类型) 读取配置文件 第一种方式 第二种方式 扩展 读取配置文件中的数据到map和list 之前使用过@Value("${name}")来读取springboot配置文件中的配置信息,比如: @Value("${server.port}") private

  • 使用springboot在工具类中读取配置文件(ClassPathResource)

    springboot工具类中读取配置文件 1.创建配置文件(application.properties) spring.activemq.broker-url=tcp://localhost:61616 spring.activemq.user=admin spring.activemq.password=admin spring.activemq.in-memory=true spring.activemq.pool.enabled=false 2.创建工具类(PropertiesUtil.

  • springboot如何读取配置文件到静态工具类

    目录 springboot读取配置文件到静态工具类 我们可以用Environment 来解决 将配置文件的值加载到工具类的静态变量中(多环境运行加载) 首先创建一个SpringBoot项目 创建配置文件 创建实体类 springboot读取配置文件到静态工具类 通常我们读取配置文件可以用@Value注解和@Configuration,@ConfigurationProperties(prefix = "xxx")等注解,但是这种方式是无法把配置读取到静态变量的,如果我们想在项目初始化时

  • SpringBoot 常用读取配置文件的三种方法详解

    目录 前言 一.使用 @Value 读取配置文件 二.使用 @ConfigurationProperties 读取配置文件 1.类上添加@Configuration注解 2.使用@EnableConfigurationProperties注解 3.使用@ConfigurationPropertiesScan扫描 三.使用 Environment 读取配置文件 四.常用的几种数据结构配置读取 我们在SpringBoot框架进行项目开发中该如何优雅的读取配置呢?或者说对于一些List或者Map应该如

随机推荐