首页 > 其他分享 >Spring Boot :项目属性配置

Spring Boot :项目属性配置

时间:2023-07-24 20:22:43浏览次数:20  
标签:服务 配置文件 Spring 配置 Boot application 地址 yml 属性

       这两天通过查阅了各种资料丰富了之前学习的了SpringBoot的各种东西,浅浅写一篇随笔结合之前学习的基本配置总结下吧。

一、Spring Boot 的项目属性配置

       在之前的学习中很多时候会用到配置的信息,这些信息在测试环境和生产环境中总会有很多不同的配置,在配置完成之后,后面还需要根据各种业务情况有可能进行修改,对于这种随时需要修改的情况,自然我们就不能直接将这些配置的代码写死,对于这种情况,我们最好的解决方式是将这些配置写在配置文件中。例如,对于配置我们可以将他写在application.yml文件中。

       事实上,在具体应用中application.properties和application.yml这两种方式都可以用,并且还允许同时使用,就是在同时使用时两者具有优先级的问题,如果同时配置两者,而且配置还冲突,那么properties的优先级是高于yml的。

       1. 在少量配置信息的情形下对于配置文件的使用

       例如说,在微服务架构时,最常见的就是使用某个服务调用其他服务提供的相关信息的情况下,那么在这个服务的配置文件中就需要配置被调用的服务地址,就例如在当前的服务里面需要调用订单微服务获取订单的相关信息,如果说订单服务的端口号是8002,就可以在配置文件中进行配置:

server:
  port: 8001
# 配置微服务的地址
url:	# 自定义的订单微服务的地址。不是系统预定义的配置,所以不会出现任何提示
   orderUrl: http://localhost:8002

       在这之后只需要在对应的类上加上一个属性,在属性中加上@Value注解就可以获得对应的配置文件中的配置信息了。

@RequestMapping("/test") 
public class ConfigController {     
    private static final Logger LOGGER = LoggerFactory.getLogger(ConfigController.class);     
    @Value("${url.orderUrl}")     // 其中的内容为 SpEL即 Spring表达式语言,可以获取配置文件中 url.orderUrl 的值     
    private String orderUrl;     
    @RequestMapping("/config")     
    public String testConfig() {         
        LOGGER.info("=====获取的订单服务地址为:{}", orderUrl);         
        return "success";     
    } 
}

        @Value注解式通过${key}获取配置文件中key和对用的value值,启动一下项目后在浏览器中输入 url:localhost:8080/test/config 请求服务后,就可以在控制台看到打印出的订单服务的地址。如下所示

=====获取的订单服务地址为:http://localhost:8002

       上述控制台的输出说明服务成功获取到了配置文件中的订单微服务地址,在实际项目中也是这么用的,如果后面因为服务器部署的原因,需要修改某个服务的地址,那么我们只要在配置文件中修改即可,对比起来便捷很多。

       2. 在多个配置信息的情形下对于配置文件的使用

       当然,在日常业务中,业务复杂度并不会这么低,一个项目很有可能有越来越多的微服务,某个模块可能需要调用多个微服务获取不同的信息,那么就需要在配置文件中配置多个微服务的地址,但是如果在调用这些服务的代码中,如果真的这样一个一个的添加@Value注解引入相应的微服务地址的话,太多了会让人感到非常繁琐,而且看起来也不够科学。所以如果在实际项目中,往往业务时比较繁琐,并且逻辑复杂,在这样的情况下,我们就要考虑封装一个或者多个配置类。

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

url: 配置多个微服务的地址        orderUrl: http://localhost:8002 订单微服务的地址,注意 key 值不能重复,但是允许 key 对应的值是集合类型        userUrl: http://localhost:8003 用户微服务的地址        shoppingUrl: http://localhost:8004        但是,在实际业务中,很有可能不仅仅只有这三个微服务,这种情况下可以先定义一个MicroServiceUrl 类来专门保存微服务的 url。对于这种配置较多的情况,可以自定义一个专门用来存储配置参数的类。
@Component //定义受管 bean,否则 Spring 无法注入配置参数值 
@ConfigurationProperties(prefix = "url") //用于读取配置信息,声明配置以 url 开头。需要解析的 key 是以 url. 开始的 
public class MicroServiceUrl { //专门用于存储配置信息的类 
    private String orderUrl; //其中的属性名称和 key 对应的除去 url.部分之外的内容一致,例如这里对应 url.orderUrl 
    private String userUrl; private String shoppingUrl; 
    // 省去 get 和 set 方法 
}

       使用@ConfigurationProperties注解和prefix来指定一个前缀,该类中的属性名就是配置中去掉前缀后的名字,对应即可。

       即:前缀名+属性名就是配置文件中定义的key,同时,在该类上需要加@Component 注解,把该类作为组件放到 Spring 容器中,让 Spring 去管理,使用的时候直接注入即可。

       在使用@ConfigurationProperties注解之前需要导入它的依赖

<dependency> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-configuration-processor</artifactId>
    <optional>true</optional> 
</dependency>
       或者是在SprigBoot可视化界面直接勾选添加        以上就是封装类的配置,之后是Controller测试,这个时候就不需要在代码中一个一个的引入这些微服务的url了,可以直接通过@Resource 注解将写好的配置类注入进来使用,相比之前很便捷,具体Controller如下。
@RestController 
@RequestMapping("/test") 
public class TestController { 
    private static final Logger LOGGER = LoggerFactory.getLogger(TestController.class); 
    @Resource //可以使用 Autowired 按照类型自动装配,也可以使用 Resource 按照名称自动装配 
    private MicroServiceUrl microServiceUrl; 
    @RequestMapping("/config") 
    public String testConfig() { 
        LOGGER.info("=====获取的订单服务地址为:{}", microServiceUrl.getOrderUrl()); 
        LOGGER.info("=====获取的用户服务地址为:{}", microServiceUrl.getUserUrl()); 
        LOGGER.info("=====获取的购物车服务地址为:{}", microServiceUrl.getShoppingUrl()); 
        return "success"; 
    } 
}
在运行之后,浏览器中请求一下,控制台就会打印出如下信息,很显然,这说明配置文件生效,同时正确获取配置文件内容 =====获取的订单服务地址为:http://localhost:8002 =====获取的订单服务地址为:http://localhost:8002 =====获取的用户服务地址为:http://localhost:8003 =====获取的购物车服务地址为:http://localhost:8004        同时,也可以使用使用@Value 获取配置数据        并且这种方式与通过配置参数 bean 的方式获取配置数据,两者不互斥,可以同时使用
@RestController 
@RequestMapping("/test") 
public class TestController { 
    @Value("${url.orderUrl}") 
    private String orderURL; 
    @Autowired 
    private MicroServiceUrl microServiceUrl; 
    private static final Logger 
        logger= LoggerFactory.getLogger(TestController.class); 
    @GetMapping("/params") 
    public String params(){ 
        logger.warn("========="+orderURL); 
        logger.error("========="+microServiceUrl.getOrderUrl()); 
        logger.error("========="+microServiceUrl.getUserUrl()); 
        return "success"; 
    } 
}

       3.在项目中,通常会存在两个环境:开发环境和生产环境。

       这两个环境的配置往往是不同的,包括环境变量、端口号、数据库连接等相关信息。为了避免在部署到生产环境时需要手动修改所有配置信息的麻烦,可以采取以下方法:
  • 新建两个配置文件:`application-dev.yml`和`application-prod.yml`,分别用于开发环境和生产环境的配置。  
  • 在`application-dev.yml`中,设置开发环境所需的配置信息,例如将访问端口号设置为8001。  
  • 在`application-prod.yml`中,设置生产环境所需的配置信息,例如将访问端口号设置为8002。
  • 在项目的启动脚本或配置文件中,通过指定运行环境来选择加载对应的配置文件。开发环境下指定加载`application-dev.yml`,而在部署到服务器上后指定加载`application-prod.yml`。  这样,当在开发环境中进行调试时,会加载开发环境的配置信息。而在将项目部署到生产环境后,会自动加载生产环境的配置信息,避免手动修改所有配置项的繁琐过程。  通过使用不同的配置文件来区分开发环境和生产环境,并在部署时根据需要加载对应的配置信息,可以有效简化项目部署流程,提高开发效率。
# 开发环境配置文件 
server: 
   port: 8001

 

# 生产环境配置文件 
server: 
   port: 8002

       在 application.yml 文件中指定读取哪个配置文件。比如在开发环境下指定读取 applicationn-dev.yml 文件

spring:  
profiles:      
   active:        
    - dev

       这样就可以在开发的时候,指定读取 application-dev.yml 文件,访问的时候使用 8001 端口,部署到服务器后,只需要将 application.yml 中指定的文件改成 application-pro.yml 即可,然后使用 8002 端口访问。

       需要注意的是这里并不是相互覆盖定义,而是只有一个配置文件生效,具体哪个配置生效取决于 active 的值。例如 active 为 abc,则自动查询对应的 application-abc.yml 文件。

       4. 总结

       这里主要了解 Spring Boot 中在业务代码中读取相关配置,包括单一配置和多个配置项,经过查阅了很多资料。看的出来,在微服务中,这种情况是比较常见,很多时候会有很多其他微服务需要调用,所以封装一个配置类来接收这些配置是个很好的处理方式。除此之外,例如数据库相关的连接参数等,也可以放到一个配置类中,其他遇到类似的场景,都可以这么处理。最后了解开发环境和生产环境配置的快速切换方式,省去了项目部署时,诸多配置信息的修改。

标签:服务,配置文件,Spring,配置,Boot,application,地址,yml,属性
From: https://www.cnblogs.com/zhaokeke/p/17576098.html

相关文章

  • 连接池与Spring,Hibernate结合
        前几篇关于Java连接池的介绍都是基于Java应用的,而我们常用的场景是与Spring和ORM框架结合,下面就利用实例学习一下这方面的配置。       1.下载相关内容:       c3p0下载地址:http://sourceforge.net/projects/c3p0/       Proxool下载地址:http:/......
  • 实例详解 EJB 中的六大事务传播属性
    前言事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。在关系数据库中,一个事务可以是一条或一组SQL语句,甚至整个程序。它有通常被称为ACID的原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持续性(Durability)四大特性:原子性(Atomicity):......
  • Caching with Spring Data Redis
    by JoshuaWhite on January25,2013 in JAVAIntheexamplebelow,I’llshowyouhowtousetheSpringData–RedisprojectasacachingproviderfortheSpringCacheAbstractionthatwasintroducedinSpring3.1.Igetalotofquestionsabouthowt......
  • 【深入浅出Spring原理及实战】「夯实基础系列」360全方位透析和探究SpringEL的开发实
    Spring表达式语言(SpEL)本文将介绍SpEL的功能、API和语言语法。概念介绍Spring表达式语言(SpEL)是一种功能强大的表达式语言,用于在运行时查询和操作对象图。它的语法与UnifiedEL相似,但提供了更多功能,其中最主要的是方法调用和基本的字符串模板功能。技术无关性虽然还有其他几......
  • virtualbox "UEFI Interactive Shell... " 错误 virtualbox machine boots to efi she
    ItturnsoutthatasIwasmessingaroundwithgettingthemachinetoload(duetoVirtualizationtechnologiesbeingdisabled),Iclickedonetoomanyitemsontheimagesettingspage. Tofixthis,gotothe"Settings"pageforthevirtualmachi......
  • springboot四
    SpringBoot集成Swagger在线接口文档1.Swagger简介1.1解决的问题随着互联网技术的发展,现在的网站架构基本都由原来的后端渲染,变成了前后端分离的形态,而且前端技术和后端技术在各自的道路上越走越远。前端和后端的唯一联系变成了API接口,所以API文档变成了前后端开发人......
  • C#中SerialPort类对串口供电需要设置DtrEnable 和RtsEnable 两个属性
    原:C#中SerialPort类对串口供电需要设置DtrEnable和RtsEnable两个属性-恒波-博客园(cnblogs.com) 在开发中有些串口设备需要串口供电,使用C#中的SerialPort类默认情况下不会出发DataReceived函数,但使用超级终端却可以接收到数据,这是因为SerialPort类的DtrEnable和RtsE......
  • SpringBoot基于Spring Security的HTTP跳转HTTPS
    简单说说之所以采用SpringSecurity来做这件事,一是SpringSecurity可以根据不同的URL来进行判断是否需要跳转(不推荐),二是不需要新建一个TomcatServletWebServerFactoryBean,新建这个Bean可能会导致SpringBoot关于Server的配置失效。三是网上大部分流传的通过实现WebServerFactor......
  • 如何在Spring Boot中记录用户系统操作流程?
    在现代Web应用程序中,记录用户系统操作流程对于监控用户行为、进行故障排查、安全审计等方面都是非常重要的。在本篇博客中,我们将介绍如何在SpringBoot中使用AOP(面向切面编程)和日志框架来实现用户系统操作流程的记录。1.介绍在大多数Web应用程序中,需要记录用户在系统中的操......
  • 【Spring Boot 初识丨maven】
    上一篇讲了使用spirngboot自带的构建器构建项目本篇来讲一讲如何从零开始构建一个maven项目前提:jdk推荐java17及以上maven推荐Maven3.5+(maven构建)一、安装maven  Maven的安装需要依赖JDK的安装,所以必须先安装完成JDK且配置好JDK环境变量后在进行Maven的安装。......