SpringBoot之Profile的两种使用方式

news/2024/12/21 21:28:00/

0. 需求

        通常项目开发过程中,会经历多种环境转换,典型的如开发环境(dev)、测试环境(test)和生产环境(prod)。在这三种不同的环境下,连接数据库时使用的配置信息是不同的,即三个不同环境对应三个不同的数据库。

        现在的需求是:当在不同的环境下,想通过修改配置文件来连接不同的数据库。比如在开发过程中启动项目时,想连接开发环境对应的数据库,可以在配置文件中指定 environment = dev。其他环境类似,此时就需要用到Spring为我们提供的Profile功能。

1. 采用一个配置文件的情况

        当SpringBoot项目只使用一个配置文件(application.yml或application.properties)时,如果想在这个配置文件中通过配置切换不同数据源,可以按照如下步骤:

1.1. 数据源类

java">package com.shg.spring.ioc.bean;import lombok.Data;@Data
public class MyDataSource {private String username;private String password;private String url;private String driver;}

1.2. 数据源配置类

java">package com.shg.spring.ioc.config;import com.shg.spring.ioc.bean.MyDataSource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;@Configuration
public class MyDataSourceConfig {@Value("${jdbc.user.dev}")private String usernameForDev;@Value("${jdbc.password.dev}")private String passwordForDev;@Value("${jdbc.jdbcUrl.dev}")private String urlForDev;@Value("${jdbc.driverClass.dev}")private String driverForDev;@Value("${jdbc.user.test}")private String usernameForTest;@Value("${jdbc.password.test}")private String passwordForTest;@Value("${jdbc.jdbcUrl.test}")private String urlForTest;@Value("${jdbc.driverClass.test}")private String driverForTest;@Value("${jdbc.user.prod}")private String usernameForProd;@Value("${jdbc.password.pro}")private String passwordForProd;@Value("${jdbc.jdbcUrl.pro}")private String urlForProd;@Value("${jdbc.driverClass.pro}")private String driverForProd;@Profile(value = {"default", "dev"})@Beanpublic MyDataSource dev() {MyDataSource myDataSource = new MyDataSource();myDataSource.setDriver(driverForDev);myDataSource.setUrl(urlForDev);myDataSource.setUsername(usernameForDev);myDataSource.setPassword(passwordForDev);return myDataSource;}@Profile(value = {"test"})@Beanpublic MyDataSource test() {MyDataSource myDataSource = new MyDataSource();myDataSource.setDriver(driverForTest);myDataSource.setUrl(urlForTest);myDataSource.setUsername(usernameForTest);myDataSource.setPassword(passwordForTest);return myDataSource;}@Profile(value = {"prod"})@Beanpublic MyDataSource prod() {MyDataSource myDataSource = new MyDataSource();myDataSource.setDriver(driverForProd);myDataSource.setUrl(urlForProd);myDataSource.setUsername(usernameForProd);myDataSource.setPassword(passwordForProd);return myDataSource;}
}

1.3 DAO层用到数据源

java">package com.shg.spring.ioc.dao;import com.shg.spring.ioc.bean.MyDataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;@Repository
public class HelloDao {// DAO层需要注入数据源@Autowiredprivate MyDataSource myDataSource;// 保存发货信息public void saveDelivery() {System.out.println("保存发货信息...用的数据源信息是:" + myDataSource);}}

1.4. 配置文件

java">spring.application.name=spring-01-iocspring.profiles.active=devjdbc.jdbcUrl.dev=jdbc:mysql://localhost:3306/dev
jdbc.driverClass.dev=com.mysql.jdbc.Driver
jdbc.user.dev=root
jdbc.password.dev=123jdbc.jdbcUrl.test=jdbc:mysql://localhost:3306/test
jdbc.driverClass.test=com.mysql.jdbc.Driver
jdbc.user.test=root
jdbc.password.test=123jdbc.jdbcUrl.prod=jdbc:mysql://localhost:3306/prod
jdbc.driverClass.prod=com.mysql.jdbc.Driver
jdbc.user.prod=root
jdbc.password.prod=123

1.5. 测试代码

java">package com.shg.spring.ioc;import com.shg.spring.ioc.dao.HelloDao;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;@SpringBootApplication
public class Spring01IocApplication {public static void main(String[] args) {ConfigurableApplicationContext ioc = SpringApplication.run(Spring01IocApplication.class, args);HelloDao helloDao = ioc.getBean(HelloDao.class);helloDao.saveDelivery();}}

 1.6. 测试结果

 1.6.1 配置文件中的spring.profiles=dev

1.6.2 配置文件中的spring.profiles=test

1.6.3 配置文件中的spring.profiles=prod

 2. 采用多个配置文件的情况

         上面的例子中,只使用一个配置文件。需要在这个配置文件中配置三种环境的配置信息,感觉不太好...

        【你也可能会反驳说,我直接使用一组配置信息,不分什么dev,test和prod环境,在配置类中也不用标注@Profile注解,而是在部署对应环境的时候,修改这个数据源的配置信息,这当然也是可以的,但是不要忘了我们现在是在讨论 Profile这个功能,这样举例子会更加清楚明了】

        下面我们采用另一种方式,来实现我们的需求,即:在不同的环境下,可以直接通过修改配置文件来连接不同的数据库。

2.1 . 三个环境对应的配置文件

2.1.1 dev环境的配置信息

2.1.2 test环境的配置信息

 2.1.3 prod环境的配置信息

2.2. 数据源类

java">package com.shg.spring.ioc.bean;import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;@Data
@Component
public class MyDataSource {@Value("${jdbc.user}")private String usernameForDev;@Value("${jdbc.password}")private String passwordForDev;@Value("${jdbc.jdbcUrl}")private String urlForDev;@Value("${jdbc.driverClass}")private String driverForDev;}

2.3. DAO层需要用到数据源

java">package com.shg.spring.ioc.dao;import com.shg.spring.ioc.bean.MyDataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;@Repository
public class HelloDao {// DAO层需要注入数据源@Autowiredprivate MyDataSource myDataSource;// 保存发货信息public void saveDelivery() {System.out.println("保存发货信息...用的数据源信息是:" + myDataSource);}}

2.4. 在主配置文件中开启需要使用哪个环境的配置文件

2.4.1. 开启dev

测试结果:

2.4.2. 开启test

测试结果:

2.4.3. 开启prod

测试结果:

3. 使用建议

        在实际项目中,推荐在不同环境使用不同的配置文件。 


http://www.ppmy.cn/news/1536423.html

相关文章

留存率的定义与SQL实现

1.什么是留存率 留存率是指在特定时间段内,仍然继续使用某项产品或服务的用户占用户总数的百分比。 通常,留存率会以日,周,或月为单位进行统计和分析。 2.SQL留存率常见问题 1.计算新用户登录的日期的次日留存率以及3日留存率 …

android + tflite 分类APP开发-1

使用自己的数据集训练模型进行图像分类 安装Model Maker 软件包 sudo apt -y install libportaudio2pip install -q tflite-model-maker 准备数据集 文件夹下各类别子文件夹,图片文件 导入包 import osimport numpy as npimport tensorflow as tf assert tf._…

动态规划10:174. 地下城游戏

动态规划解题步骤: 1.确定状态表示:dp[i]是什么 2.确定状态转移方程:dp[i]等于什么 3.初始化:确保状态转移方程不越界 4.确定填表顺序:根据状态转移方程即可确定填表顺序 5.确定返回值 题目链接:174.…

Webstorm 中对 Node.js 后端项目进行断点调试

首先,肯定需要有一个启动服务器的命令脚本。 然后,写一个 debug 的配置: 然后,debug 模式 启动项目和 启动调试服务: 最后,发送请求,即可调试: 这几个关键按钮含义: 重启…

【C++ 11】nullptr 空指针

文章目录 【 0. 问题背景 】0.1 野指针和悬空指针0.2 传统空指针 NULL0.3 传统空指针的局限性 【 1. 基本用法 】【 2. nullptr 的应用 】2.1 nullptr 解决 NULL 的遗留BUG2.2 简单实例 【 0. 问题背景 】 0.1 野指针和悬空指针 总结 野指针悬空指针产生原因指针变量未被初始…

23.1 k8s监控中标签relabel的应用和原理

本节重点介绍 : relabel的源码在 7.7节做过详细的解读强大的relabel能力 在k8s中的应用 应用1: labelmap 在采集cadvisor指标时 对服务发现标签key名字截取应用2: 采集pod自定义指标中replace 和 keep的应用应用3: k8s服务组件采集时的endpo…

如何高效使用Prompt与AI大模型对话

一、如何与人工智能对话 在人工智能的世界里,提示词(Prompt)就像是一把钥匙,能够解锁AI智能助手的潜力,帮助你更高效地获取信息、解决问题。但如何正确使用这把钥匙,却是一门艺术。本文将带你了解提示词的…

WPF入门教学二十三 自定义控件开发

在WPF(Windows Presentation Foundation)中,自定义控件开发是一项强大的功能,它允许开发者根据特定需求创建独特的用户界面元素。自定义控件可以是简单的用户控件,也可以是更复杂的继承自现有控件的自定义控件。以下是…