SpringBoot中的项目属性配置

2023-11-04

概述

在项目中,很多时候需要用到一些配置信息,这些信息在测试环境和生产环境下可能会有不同的配置,后面根据实际业务情况有可能还需要再做修改,针对这种情况,我们不能将这些配置在代码中写死,最好是写到配置文件中,比如可以把这些信息写到 application.yml 文件中


1.单一服务的配置和调用

在微服务架构中,最常见的就是某个服务需要调用其他服务来获取其提供的相关信息,那么在该服务的配置文件中需要配置被调用的服务地址,比如在当前服务里,我们需要调用订单微服务获取订单相关的信息,假设订单服务的端口号是8002,那么我们可以做如下配置

server:
  port: 8082
 
# 配置微服务的地址
url:
  # 订单微服务的地址
  orderUrl: http://localhost:8002

在业务代码中,我们可以使用@Value注解来获取到这个配置的订单服务地址,在对应的类中加上一个属性,在属性上使用@Value注解即可获取到配置文件中的配置信息,如下

package com.example.springdemo1.controller;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/test")
public class ConfigController {
    private static final Logger LOGGER = LoggerFactory.getLogger(ConfigController.class);
    
    @Value("${url.orderUrl}")
    private String orderUrl;
    
    @RequestMapping("/config")
    public String testConfig(){
        LOGGER.info("====获取的订单服务地址为:{}",orderUrl);
        return "success";
    }
}

@Value注解上通过${key}即可获取配置文件中的key对应的value值。我们启动一下项目,在浏览器中输入http://localhost:8082/test/config,可以看到控制台会打印出订单服务地址

在这里插入图片描述
说明我们成功获取到了配置文件中的订单微服务地址,后面如果需要修改某个服务的地址,那么只要在配置文件中修改即可

2.多个配置信息的情形

一个项目中可能会有越来越多的微服务,某个模块可能调用多个微服务获取不同的信息,那么就需要在配置文件中配置多个微服务的地址,可是,在需要调用这些微服务的代码中,如果这样一个个去使用@Value注解引入相应的微服务地址的话,太过于繁琐,也不科学。
所以,在实际项目中,业务繁琐,逻辑复杂的情况下,需要考虑封装一个或多个配置类。

举个例子:假如在当前服务中,某个业务需要同时调用订单微服务、用户微服务和购物车微服务,分别获取订单、用户和购物车相关信息,然后对这些信息做一定的逻辑处理,那么在配置文件中,我们需要将这些微服务的地址都配置好

# 配置微服务的地址
url:
  # 订单微服务的地址
  orderUrl: http://localhost:8082
  # 用户微服务的地址
  userUrl: http://localhost:8083
  # 购物车微服务的地址
  shoppingUrl: http://localhost:8084

对于这种情况,我们可以先定义一个ServiceUrl类,用来保存微服务的url

package com.example.springdemo1.conf;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Component
@ConfigurationProperties(prefix="url")
public class ServiceUrl {
    private String orderUrl;
    private String userUrl;
    private String shoppingUrl;

    public ServiceUrl(String orderUrl, String userUrl, String shoppingUrl) {
        this.orderUrl = orderUrl;
        this.userUrl = userUrl;
        this.shoppingUrl = shoppingUrl;
    }

    @Override
    public String toString() {
        return "ServiceUrl{" +
                "orderUrl='" + orderUrl + '\'' +
                ", userUrl='" + userUrl + '\'' +
                ", shoppingUrl='" + shoppingUrl + '\'' +
                '}';
    }

    public String getOrderUrl() {
        return orderUrl;
    }

    public void setOrderUrl(String orderUrl) {
        this.orderUrl = orderUrl;
    }

    public String getUserUrl() {
        return userUrl;
    }

    public void setUserUrl(String userUrl) {
        this.userUrl = userUrl;
    }

    public String getShoppingUrl() {
        return shoppingUrl;
    }

    public void setShoppingUrl(String shoppingUrl) {
        this.shoppingUrl = shoppingUrl;
    }
}

注意:使用@ConfigurationProperties注解并且使用prefix来指定一个前缀,然后该类中的属性名就是配置文件中的key,同时,该类上面需要加上@Component注解,把该类作为组件放到Spring容器中,让Spring去管理,我们使用时候直接注入即可,使用@ConfigurationProperties注解需要导入它的依赖

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>

写个Controller来测试一下,此时,就不需要在代码中一个一个引入这些微服务的url了,直接通过@Resource注解将刚刚写好配置类注入进来即可使用了

package com.example.springdemo1.controller;

import com.example.springdemo1.conf.ServiceUrl;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
@RestController
@RequestMapping("/test")
public class TestServiceUrl {
    private static final Logger LOGGER = LoggerFactory.getLogger(TestServiceUrl.class);
    @Resource
    private ServiceUrl serviceUrl;

    @RequestMapping("/configUrl")
    public String testConfigUrl(){
        LOGGER.info("====获取订单服务地址为:{}",serviceUrl.getOrderUrl());
        LOGGER.info("====获取的用户服务地址为:{}",serviceUrl.getUserUrl());
        LOGGER.info("====获取的购物车服务地址为:{}",serviceUrl.getShoppingUrl());
        return "success";
    }

}

启动项目,在浏览器中输入http://localhost:8082/test/testUrl,即可看到控制台打印出的微服务地址

3.指定项目配置文件

我们知道,在实际项目中,一般有三个环境:开发环境、生产环境和测试环境,开发环境中的配置和生产环境还有测试环境中的配置往往不同,比如:环境、端口、数据库、相关地址等,开发环境、生产环境和测试环境都应有一套对应的配置信息,在开发中,指定读取开发环境的配置,将项目部署到服务器上之后,再指定去读取生产环境的配置

server:
  port: 8081
spring:
  profiles:
    active: dev
---
server:
  port: 8082
spring:
  profiles: dev
logging:
  config: logback.xml
  level:
    com.example.springdemo1.dao: trace

# 配置微服务的地址
url:
  # 订单微服务的地址
  orderUrl: http://localhost:8082
  # 用户微服务的地址
  userUrl: http://localhost:8083
  # 购物车微服务的地址
  shoppingUrl: http://localhost:8084

---
server:
  port: 8083
spring:
  profiles: test
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SpringBoot中的项目属性配置 的相关文章

随机推荐

  • 前端利用html2canvas+jspdf实现html转pdf

    公司业务的月报页面 要实现pdf下载 查了资料 大概有个方向 就是利用html2canvas把html转为图片 然后再生成pdf格式的文件实现了下载 核心代码 import html2canvas from html2canvas impo
  • @Async注解在springboot项目中的使用

    众所周知 Async注解是开启一个异步线程的执行 但在springboot项目中如何具体的使用这个注解 还需要一一分析 仔细研究如何能更好的使用 Async注解 1 在项目启动类上添加 EnableAsync注解 如果没有这个注解而仅仅只有
  • 虚拟机安装Ubuntu16.04详细步骤

    文章目录 系统下载 安装VMware 配置虚拟机 系统安装 系统下载 官方下载地址 https ubuntu com download 阿里云镜像 推荐 http mirrors aliyun com ubuntu releases 16
  • linux/vim 操作tips

    1 Linux查看物理CPU个数 核数 逻辑CPU个数 总核数 物理CPU个数 X 每颗物理CPU的核数 总逻辑CPU数 物理CPU个数 X 每颗物理CPU的核数 X 超线程数 查看物理CPU个数 cat proc cpuinfo grep
  • 服务器部署redis和springboot整合redis详细步骤

    目录 redis服务器部署 在springboot项目中整合redis redis相关链接 文档 文件下载 阿里云服务器官网 云小站 专享特惠 云产品推荐 阿里云 redis服务器部署 购买阿里云服务器后 到控制台查看实例 获取公网IP 账
  • 蓝桥杯——方格填数(JAVA)

    题目 本题为填空题 只需要算出结果后 在代码中使用输出语句将所填结果输出即可 如下的 10个格子 填入 0 9 的数字 要求 连续的两个数字不能相邻 左右 上下 对角都算相邻 一共有多少种可能的填数方案 运行限制 最大运行时间 1s 最大运
  • 【全】正则表达式语法

    简单来说 正则表达式就是描述字符串的规则 其作用如下 1 校验数据的有效性 2 从文本中提取内容 3 文本内容替换 元字符 元字符即正则表达式中具有特殊含义的专用字符 主要分为5类 1 基础 任意字符 换行除外 d 任意数字 D 任意非数字
  • Android自定义控件之自定义属性(二)

    前言 上篇介绍了自定义控件的基本要求以及绘制的基本原理 本篇文章主要介绍如何给自定义控件自定义一些属性 本篇文章将继续以上篇文章自定义圆形百分比为例进行讲解 有关原理知识请参考Android自定义控件之基本原理 一 这篇文章 需求产生背景
  • 关于MPEG4 码流(mpeg4 raw data)的格式分析

    MPEG4码流开头往往如下 00 00 01 B0 F5 00 00 01 B5 09 00 00 01 00 00 00 01 20 08 86 84 00 3F 18 58 21 20 A3 1F 00 00 01 B2 58 76 6
  • 故障诊断1—基础理论

    1 故障诊断概念 故障诊断主要研究如何对系统中出现的故障进行检测 分离和辨识 即判断故障是否发生 定位故障发生的部位和种类 以及确定故障的大小和发生的时间等 2 故障诊断方法 故障诊断防范可分为定性分析和定量分析两大类 如图 1 所示 其中
  • Hexo博客优化:在Next主题中设置进阶版Live2D看板娘————拒绝踩坑!!!!

    最初级的用法 使用官方包安装 安装非常简单 但效果一般 hexo live 2d地址 https github com xiazeyu live2d widget models git命令行中输入 npm install save hexo
  • [SWPUCTF 2022 新生赛]ez_ez_php

    这段代码是一个简单的PHP文件处理脚本 让我们逐行进行分析 error reporting 0 这行代码设置了错误报告的级别为0 意味着不显示任何错误 if isset GET file 这行代码检查是否存在一个名为 file 的GET参数
  • Redis第二十七讲 Redis集群批量操作带来的问题

    Redis集群批量操作 比如对我们之前搭建的三主三从集群进行批量数据插入操作会报什么错误呢 关于Redis集群搭建可以参考我之前的一篇博客 Redis第十九讲 Redis主从 哨兵 集群搭建讲解 Redis集群搭建相对于哨兵还是比较简单的
  • app服务器 数据库文件,app访问服务器mysql数据库文件

    app访问服务器mysql数据库文件 内容精选 换一换 云数据库RDS服务上的MySQL在使用上有一些固定限制 用来提高实例的稳定性和安全性 具体详见表1 对于mysqlpump工具 由于在并行备份场景有coredump问题 不建议您使用
  • 特征工程(一)-- 概述

    简介 特征工程本质上可以理解成数据预处理 其目的是最大限度地从原始数据中提取特征以供算法和模型使用 从而提高模型的准确率等指标 处理的数据中的特征直接影响到正在使用的模型以及能达到的最好的结果 当模型和特征都确定之后 通过调参带来的收益微乎
  • JVM(HotSpot)7种垃圾收集器

    JVM HotSpot 7种垃圾收集器 7种垃圾收集器作用于不同的分代 如果两个收集器之间存在连续 就说明他们可以搭配使用 从JDK1 3到现在 从Serial收集器 Parallel收集器 CMS G1 用户线程停顿时间不断缩短 但仍然无
  • 前端 token-防爆破(CSRF Token Bypass)-burpsuit

    知识点 利用 burpsuite 循环把前端页面上的 token 值加到登录的 token 上 前端页面
  • laravel 利用监听器进行sql语句记录

    利用监听器进行sql语句记录 1 监听sql语句的事件类已经定义 直接创建监听器类即可 监听sql make listener QueryListener event Illuminate Database Events QueryExec
  • 计算机组成-三个子系统互连

    文章目录 CPU与存储器的连接 数据总线 地址总线 控制总线 I O设备的连接 控制器 串行控制器 并行控制器 常用控制器 SCSI小型计算机系统接口 火线 通用串行总线 USB 高清清晰度多媒体接口 HDMI CPU与存储器的连接 CPU
  • SpringBoot中的项目属性配置

    概述 在项目中 很多时候需要用到一些配置信息 这些信息在测试环境和生产环境下可能会有不同的配置 后面根据实际业务情况有可能还需要再做修改 针对这种情况 我们不能将这些配置在代码中写死 最好是写到配置文件中 比如可以把这些信息写到 appli