解析Spring Boot中的Profile:配置文件与代码的双重掌控

news2025/1/21 3:04:37

目录

  • 创建一个spring boot 项目
  • spring boot 中的配置体系
    • 配置文件与 Profile
    • 代码控制与Profile

创建一个spring boot 项目

基于 Spring Boot 创建 Web 应用程序的方法有很多,我们选择在idea中直接进行创建,服务器URL选择Spring Initializer 网站,类型选择Maven项目,java版本根据jdk版本进行选择。
在这里插入图片描述
然后添加相应依赖以及选择spring boot版本

在这里插入图片描述
接下来我们写一个Controller

@RestController
@RequestMapping("/user")
public class UserController {
    // 请求映射,用于处理请求
    @RequestMapping("/zcx")
    public Userinfo getUserInfo() {
        // 创建Userinfo对象
        Userinfo userinfo = new Userinfo();
        // 设置age属性
        userinfo.setAge("45");
        // 设置name属性
        userinfo.setName("zcx-yyds");
        // 返回Userinfo对象
        return userinfo;
    }

}

现在我们需要对这个应用程序进行打包,使用idea上的打包工具,点击package进行打包
在这里插入图片描述
我们将得到一个springboot1-0.0.1-SNAPSHOT.jar文件,而这个 jar 文件就是可以直接运行的可执行文件,内置了 Tomcat Web 服务器。我们直接使用如下命令进行运行这个Spring boot程序。

java -jar springboot1-0.0.1-SNAPSHOT.jar

然后我们使用postman来进行项目访问测试,得到如下返回结果,证明我们的程序服务已经启动成功了。

在这里插入图片描述
现在我们已经明白如何构建、打包以及运行一个简单的 Web 应用程序了。

spring boot 中的配置体系

在 Spring Boot 中,其核心设计理念是对配置信息的管理采用约定优于配置,也就是说约定大于配置
Spring Boot中的Profile是一个非常有用的功能,它可以让我们在不修改代码的情况下,通过配置文件来控制程序的行为。
在Spring Boot中,Profile是一种用于控制应用程序行为的机制。通过使用不同的Profile,我们可以根据不同的环境或场景来加载不同的配置信息,从而实现应用程序的灵活配置。

配置文件与 Profile

根据环境的不同而存在很多套配置。假设我们存在如下所示的配置文件集合:
在这里插入图片描述
配置文件application-dev.properties中的代码为:

server.port=8080
spring.datasource.url=jdbc:mysql://localhost:3306/dev_db
spring.datasource.username=root 
spring.datasource.password=666666

配置文件application-prod.properties中的代码为:

server.port=8080
spring.datasource.url=jdbc:mysql://localhost:3306/prod_db
spring.datasource.username=root 
spring.datasource.password=666666

常见的配置文件命名方式有以下几种:
/{application}-{profile}.properties
/{label}/{application}-{profile}.properties

在 Spring Boot 中,我们可以在主 application.properties 中使用如下的配置方式来激活当前所使用的 Profile:

spring.profiles.active = dev

当然还有以下几种方式启动Profile:

  1. 在主 application.properties指定要激活的Profile。
spring.profiles.active = dev
  1. 在启动命令中指定Profile。
java -jar springboot1-0.0.1-SNAPSHOT.jar --spring.profiles.active=prod
  1. 在程序中显示设置Profile。例如:
@SpringBootApplication
public class Springboot1Application {

    public static void main(String[] args) {
        SpringApplication app = new SpringApplication(Springboot1Application.class);
        app.setAdditionalProfiles("dev");
        app.run(args);
    }
}

这将激活名为prod的Profile。

代码控制与Profile

在 Spring Boot 中,Profile 这一概念的应用场景还包括动态控制代码执行流程。为此,我们需要使用 @Profile 注解,Profile注解可以用于指定某个类或方法在特定的配置环境下生效。只要是被@Component@Configuration注解的类都可以使用@Profile注解。
使用一个示例来了解Profile注解的使用方法:

@Configuration
public class DataSourceConfig {
    @Bean
    @Profile("dev")
    public DataSource devDataSource() {

        //创建 dev 环境下的 DataSource
        return null;
    }

    @Bean()
    @Profile("prod")
    public DataSource prodDataSource() {

        //创建 prod 环境下的 DataSource
        return null;
    }

}

通过这种方式,可以达到与使用配置文件相同的效果。
我们来看一个更为详细具体的例子:

  1. 创建一个接口 MyService
public interface MyService {
    void doSomething();
}
  1. 创建两个不同的实现类,分别用于不同的配置文件。

@Component
@Profile("prod")
public class ProdMyService implements MyService {
    @Override
    public void doSomething() {
        System.out.println("Prod service is running.");
    }
}

@Component
@Profile("dev")
public class DevMyService implements MyService {
    @Override
    public void doSomething() {
        System.out.println("Dev service is running.");
    }
}

上述示例中,我们创建了两个不同的实现类,一个用于 development 配置文件,另一个用于 production 配置文件。@Profile 注解分别标记了它们,以便 Spring 知道在哪个配置文件下激活它们。
3. 在 Spring 配置文件(例如 application.propertiesapplication.yml)中指定要激活的配置文件,例如: application.properties

spring.profiles.active=prod

spring.profiles.active 设置为 development,表示我们希望激活的开发配置文件。
4. 创建一个启动类,以演示如何使用 MyService

@SpringBootApplication
public class Springboot1Application implements CommandLineRunner {

    // 声明一个注入的MyService对象
    @Autowired
    private MyService myService;

    // 声明一个名为run的方法,用来启动Spring应用
    public static void main(String[] args) {
        // 调用SpringApplication的run方法,传入Springboot1Application类和args参数
        SpringApplication.run(Springboot1Application.class, args);
    }

    // 方法run,用来执行Spring应用的业务逻辑
    @Override
    public void run(String... args) {
        // 调用myService的doSomething方法
        myService.doSomething();
    }
}

在这里插入图片描述
通过结果我们发现运行这个应用程序时,它会根据配置文件中的 spring.profiles.active 属性来选择相应的实现类。
如果你还想了解更多内容请参考spring boot官网。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/996919.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

libnetcdf.so.19: cannot open shared object file: No such file or directory

Linux编译程序时出现问题 在linux系统上,编译一个工具包后,在运行该工具包时,出现以下报错: libnetcdf.so.19: cannot open shared object file: No such file or directory仔细分析报错信息可以发现:在运行该工具包…

UG\NX二次开发 判断向量在指定的公差内是否为零,判断是否是零向量 UF_VEC3_is_zero

文章作者:里海 来源网站:王牌飞行员_里海_里海NX二次开发3000例,里海BlockUI专栏,C\C++-CSDN博客 简介: UG\NX二次开发 判断向量在指定的公差内是否为零,判断是否是零向量 UF_VEC3_is_zero 效果: 代码: #include "me.hpp"void ufusr(char* param, int* retco…

Pytorch实现基于LSTM的情感分析

文章目录 本文参考导入必要的包介绍torchnet做数据的导入给必要的参数命名加载文本数据数据前处理模型训练验证 本文参考 PyTorch深度学习项目实战100例 https://weibaohang.blog.csdn.net/article/details/127154284?spm1001.2014.3001.5501 这段代码是一个基于PyTorch实现…

LeetCode(力扣)37. 解数独Python

LeetCode37. 解数独 题目链接代码 题目链接 https://leetcode.cn/problems/sudoku-solver/description/ 代码 class Solution:def solveSudoku(self, board: List[List[str]]) -> None:"""Do not return anything, modify board in-place instead."…

使用数据库表快速生成代码

这里使用的EasyCode插件,直接下载即可,这里需要有数据库的技术与使用idea,会使用起来更流畅! 使用idea连接数据库 右键选择表 勾选你所需要的添加, 鄙人一般除了debug,其他都会勾选上 点击确定,…

【电源专题】不合理接地引发的典型问题及地环路隔离的方法

在文章:【电源专题】接地的类型 中我们讲到因为历史的原因接地在不同时期的概念是不同的。到了如今大规模的集成电路时代,在单板中接地其实是想要一个参考电位,一个等势点。 但是理想终究是理想,在现实接地中,往往因为接地平面的阻抗不是0,而电源电流过大、信号频率过高…

目标检测笔记(十五): 使用YOLOX完成对图像的目标检测任务(从数据准备到训练测试部署的完整流程)

文章目录 一、目标检测介绍二、YOLOX介绍三、源码获取四、环境搭建4.1 环境检测 五、数据集准备六、模型训练七、模型验证八、模型测试 一、目标检测介绍 目标检测(Object Detection)是计算机视觉领域的一项重要技术,旨在识别图像或视频中的…

Linux权限的概念和管理

Linux权限的概念和管理 1. Linux权限的概念2. Linux权限管理2.1 文件访问者的分类(人)2.2 文件类型和访问权限(事物属性)2.2.1 文件类型2.2.2 基本权限 2.3 文件权限值的表示方法2.4文件访问权限的相关设置方法1. chmod&#xff0…

C++的运算符重载介绍

所谓重载,就是赋予新的含义。函数重载(Function Overloading)可以让一个函数名有多种功能,在不同情况下进行不同的操作。运算符重载(Operator Overloading)也是一个道理,同一个运算符可以有不同的功能。 实际上,我们已经在不知不觉中使用了运算符重载。例如,+号可以对…

IDEA控制台取消悬浮全局配置SpringBoot配置https

IDEA控制台取消悬浮 idea 全局配置 SpringBoot(Tomcat) 配置https,同时支持http 利用JDK生成证书 keytool -genkey -alias httpsserver -keyalg RSA -keysize 2048 -keystore server.p12 -validity 3650配置类 Configuration public class TomcatConfig {Value(&quo…

【golang】调度系列之m

调度系列 调度系列之goroutine 上一篇中介绍了goroutine,最本质的一句话就是goroutine是用户态的任务。我们通常说的goroutine运行其实严格来说并不准确,因为任务只能被执行。那么goroutine是被谁执行呢?是被m执行。 在GMP的架构中&#xff…

PC首页资源加载速度由8s降到2s的优化实践

随着需求的不断开发,前端项目不断膨胀,业务提出:你们的首页加载也太慢啦,我都需要7、8秒才能看到内容,于是乎主管就让我联合后端开启优化专项,目标是3s内展示完全首页的内容。 性能指标 开启优化时&#…

G0第28章:Go语言微服务框架

Go-kit Go kit教程04——中间件和日志 本文主要介绍了Go kit 中的中间件,并以日志中间件为例演示了如何设计和实现中间件。 上一篇中,我们对go kit搭建的项目进行了目录结构拆分 中间件 在 go kit 中,它对中间件的定义是一个接收Endpoint…

DataGridView绑定数据更新

1、创建数据类 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace DataGridViewTest {internal class UserData{public string Name { get; set; }public int Weight { get; set; }public int …

“内存炸弹”DDOS拒绝服务攻击

Windows平台演示 最早的内存炸弹是 zip 炸弹,也称为死亡 zip,它是一种恶意计算机文件,旨在使读取该文件的程序崩溃或瘫痪。zip 炸弹不会劫持程序的操作,而是利用解压缩压缩文件所需的时间、磁盘空间或内存。 zip 炸弹的一个示例…

ConnectionError: Error connecting to Visdom server

pip install visdom python -m visdom.server点击网站即可访问

Modelsim仿真问题解疑三:LM_LICENSE_FILE与Vivado命名冲突

现象: modelsim和Vivado同一时间只能使用一个,另一个会报license相关的错误 原因: modelsim和Vivado的环境变量名称都为LM_LICENSE_FILE,值配置为其中一个时会导致另一个值被覆盖 解决: 对LM_LICENSE_FILE同时配置modelsim和v…

win10环境安装使用docker-maxwell

目的:maxwell可以监控mysql数据变化,并同步到kafka、mq或tcp等。 maxwell和canal区别: maxwell更轻量,canal把表结构也输出了 docker bootstrap可导出历史数据,canal不能 环境 :win10,mysql5…

反编译小程序 SyntaxError: Unexpected token ‘}‘ 异常处理

反编译小程序出现异常: SyntaxError: Unexpected token ‘}’ 网上很多都说使用最新版本的反编译 wxappUnpacker-master 包可以进行解析,但是大神已经停止了更新wxappUnpacker-master 包; 查找了网上大部分的wxappUnpacker-master 包&#…

查看mysql数据库的charset和collation

SELECT * FROM information_schema.SCHEMATA WHERE schema_name test_data; 发现: chaset是utf8mb4,collation是utf8mb4_generic_ci 可笑的是我导入sql脚本,要把脚本中所有的utf8mb4改为utf8,将utf8mb4_generic_ci为utf8_unico…