SpringBoot中的项目属性配置

概述

在项目中,很多时候需要用到一些配置信息,这些信息在测试环境和生产环境下可能会有不同的配置,后面根据实际业务情况有可能还需要再做修改,针对这种情况,我们不能将这些配置在代码中写死,最好是写到配置文件中,比如可以把这些信息写到 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
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值