热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

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

<&#63;xml version="1.0" encoding="UTF-8"&#63;>

 
  
  
  
  
  
 

创建配置类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);首先要了解每个注解的使用场景后,其次根据项目实际情况来具体的使用

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


推荐阅读
  • SpringBoot底层注解用法及原理
    2.1、组件添加1、Configuration基本使用Full模式与Lite模式示例最佳实战配置类组件之间无依赖关系用Lite模式加速容器启动过程,减少判断配置类组 ... [详细]
  • mybatis相关面试题 ... [详细]
  • 深入理解SAP Fiori及其核心概念
    本文详细介绍了SAP Fiori的基本概念、发展历程、核心特性、应用类型、运行环境以及开发工具等,旨在帮助读者全面了解SAP Fiori的技术框架和应用场景。 ... [详细]
  • Python安全实践:Web安全与SQL注入防御
    本文旨在介绍Web安全的基础知识,特别是如何使用Python和相关工具来识别和防止SQL注入攻击。通过实际案例分析,帮助读者理解SQL注入的危害,并掌握有效的防御策略。 ... [详细]
  • 这个报错出现在userDao里面,sessionfactory没有注入。解决办法:spring整合Hibernate使用test测试时要把spring.xml和spring-hib ... [详细]
  • 本文详细介绍如何在Spring Boot项目中集成和使用JPA,涵盖JPA的基本概念、Spring Data JPA的功能以及具体的操作步骤,帮助开发者快速掌握这一强大的持久化技术。 ... [详细]
  • J2EE平台集成了多种服务、API和协议,旨在支持基于Web的多层应用开发。本文将详细介绍J2EE平台中的13项关键技术规范,涵盖从数据库连接到事务处理等多个方面。 ... [详细]
  • Spring Boot 初学者指南(第一部分)
    本文介绍了Spring Boot框架的基础知识,包括其设计理念、主要优势以及如何简化传统的J2EE开发流程。 ... [详细]
  • 深入解析 RuntimeClass 及多容器运行时应用
    本文旨在探讨RuntimeClass的起源、功能及其在多容器运行时环境中的实际应用。通过详细的案例分析,帮助读者理解如何在Kubernetes集群中高效管理不同类型的容器运行时。 ... [详细]
  • 本文将详细介绍如何配置并整合MVP架构、Retrofit网络请求库、Dagger2依赖注入框架以及RxAndroid响应式编程库,构建高效、模块化的Android应用。 ... [详细]
  • 在使用mybatis进行mapper.xml测试的时候发生必须为元素类型“mapper”声明属性“namespace”的错误项目目录结构UserMapper和UserMappe ... [详细]
  • 模型-视图-控制器(MVC)模式在软件开发中极为普遍,不仅被广泛应用于Web框架,也在GUI客户端中得到应用。然而,这种模式的实际应用可能并非完全遵循原初的设计理念,有时更像是一个营销概念。本文将深入探讨MVC及其相关模式MVP、MVVM和MVA的异同,以及它们各自的应用场景。 ... [详细]
  • 深入解析 Android 中的 ActivityGroup 实现
    本文详细探讨了如何在 Android 应用中使用 ActivityGroup 来实现类似微博客户端主界面的效果,并分析了 TabActivity 的局限性,推荐使用更为灵活的 ActivityGroup 方案。 ... [详细]
  • Kubernetes与Docker之间的关系解析
    本文探讨了Kubernetes(简称k8s)与Docker之间的关系,旨在帮助读者理解这两种技术如何协同工作,以提高应用程序的部署效率和可扩展性。文章首先介绍了两者的基本概念,然后从虚拟化和部署的角度深入分析。 ... [详细]
  • Docker环境下Redis的安装与配置
    本文详细介绍了如何在Docker环境中安装和配置Redis,包括镜像下载、容器启动、连接测试以及持久化设置等步骤。同时,还提供了使用Redis可视化管理工具的方法,帮助用户更好地管理和监控Redis实例。 ... [详细]
author-avatar
粗陶工作室
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有