SpringBoot之Profile的两种使用方式

news2024/9/30 17:25:49

0. 需求

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

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

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

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

1.1. 数据源类

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. 数据源配置类

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"})
    @Bean
    public MyDataSource dev() {
        MyDataSource myDataSource = new MyDataSource();
        myDataSource.setDriver(driverForDev);
        myDataSource.setUrl(urlForDev);
        myDataSource.setUsername(usernameForDev);
        myDataSource.setPassword(passwordForDev);
        return myDataSource;
    }

    @Profile(value = {"test"})
    @Bean
    public MyDataSource test() {
        MyDataSource myDataSource = new MyDataSource();
        myDataSource.setDriver(driverForTest);
        myDataSource.setUrl(urlForTest);
        myDataSource.setUsername(usernameForTest);
        myDataSource.setPassword(passwordForTest);
        return myDataSource;
    }

    @Profile(value = {"prod"})
    @Bean
    public MyDataSource prod() {
        MyDataSource myDataSource = new MyDataSource();
        myDataSource.setDriver(driverForProd);
        myDataSource.setUrl(urlForProd);
        myDataSource.setUsername(usernameForProd);
        myDataSource.setPassword(passwordForProd);
        return myDataSource;
    }
}

1.3 DAO层用到数据源

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层需要注入数据源
    @Autowired
    private MyDataSource myDataSource;

    // 保存发货信息
    public void saveDelivery() {
        System.out.println("保存发货信息...用的数据源信息是:" + myDataSource);
    }

}

1.4. 配置文件

spring.application.name=spring-01-ioc

spring.profiles.active=dev

jdbc.jdbcUrl.dev=jdbc:mysql://localhost:3306/dev
jdbc.driverClass.dev=com.mysql.jdbc.Driver
jdbc.user.dev=root
jdbc.password.dev=123

jdbc.jdbcUrl.test=jdbc:mysql://localhost:3306/test
jdbc.driverClass.test=com.mysql.jdbc.Driver
jdbc.user.test=root
jdbc.password.test=123

jdbc.jdbcUrl.prod=jdbc:mysql://localhost:3306/prod
jdbc.driverClass.prod=com.mysql.jdbc.Driver
jdbc.user.prod=root
jdbc.password.prod=123

1.5. 测试代码

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. 数据源类

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层需要用到数据源

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层需要注入数据源
    @Autowired
    private 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.coloradmin.cn/o/2180228.html

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

相关文章

【论文导读】Graphusion (LLM + KGC)

序言 第一次论文出现在 《Leveraging Large Language Models for Concept Graph Recovery and Question Answering in NLP Education》 论文地址:https://arxiv.org/abs/2402.14293 七月份的时候应该是又改进了一次。但是又发了一篇新的地址:《Graphu…

css 中 ~ 符号、text-indent、ellipsis、ellipsis-2、text-overflow: ellipsis、::before的使用

1、~的使用直接看代码 <script setup> </script><template><div class"container"><p><a href"javascript:;">纪检委</a><a href"javascript:;">中介为</a><a href"javascript:…

SpringAOP实现的两种方式-JDK动态代理和CGLIB动态代理

前言 想要了解SpringAOP的实现方式&#xff0c;需要先了解什么是AOP OOP和AOP的区别 OOP 面向对象&#xff0c;允许开发者定义纵向的关系&#xff0c;但并适用于定义横向的关系&#xff0c;导致了大量代码的重复&#xff0c;而不利于各个模块的重用。 AOP&#xff0c;一般称为…

让小脚本成为自己高效测试的工具

测试中会遇到的工具 软件测试如果仅仅靠手工去执行会发现在很多地方力不从心&#xff0c;虽然市面上已经有大牛开源了一些测试工具可以供我们使用但是在一些公司特有的业务方面则需要我们借助开源或重新做一个自己的测试工具。 测试常用的开源工具 死链接检测工具 Xenu home…

如何使用便签高效管理自己的工作和时间?

在快节奏的现代生活中&#xff0c;我们每天都要面对众多工作任务&#xff0c;而时间却是有限的。如何在有限的时间内高效地完成工作&#xff0c;成为了每个职场人士必须面对的挑战。为了更好地管理时间&#xff0c;提高工作效率&#xff0c;我们往往需要借助一些工具来帮助我们…

Linux上Java项目环境安装

java环境 一.免费的管理Linux软件 家庭/学校免费 - NetSarang Website (xshell.com) 二.安装jdk // 检查以前是否安装过jdk java -version // 我们还可以通过以下指令来看我们安装了多少openJDK apt list --installed | grep openjdk// 如果你想卸载某个apt安装的java版本&am…

CMOS Sensor调试笔记

最近在调CMOS Sensor&#xff1b;基于无ISP的芯片。 第一步&#xff0c;找模组厂要到对应Sensor对应分辨率&#xff0c;YUV信息的驱动。 第二步&#xff0c;确认信号的极性&#xff0c;VSYNC&#xff0c;SYNC, PCLK。 第三步&#xff0c;开始测试。 问题解决&#xff1a; 1&am…

覆盖生活中各方面的5款软件,非常好用

​ 在现代生活中&#xff0c;各类工具软件为我们提供了便捷的解决方案&#xff0c;从日程管理到系统优化&#xff0c;再到文件传输与多媒体编辑&#xff0c;各类软件的功能多样&#xff0c;极大地提升了我们的工作与生活效率。 1.日历清单——日历清单 ​ 日历清单是一款集日…

运营计划管理——电商运营(案例分享)

运营计划&#xff0c;作为运营管理的重要组成部分&#xff0c;通过科学规划与有效执行&#xff0c;对确保企业目标实现起着至关重要的作用。 运营计划是指通过制定、执行、监控和调整运营计划&#xff0c;以确保企业资源得到合理配置&#xff0c;业务活动有序进行&#xff0c;最…

学习threejs,添加户外光照光源

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言二、&#x1f340;绘制任意字体模型…

windows 桌面采集音频

头文件&#xff1a; #ifndef __CAPTURE_AUDIO__ #define __CAPTURE_AUDIO__#include <functional> #include <windows.h> #pragma comment(lib, "winmm.lib")class CaptureAudio { public:CaptureAudio();~CaptureAudio();public:bool Init(const std::…

云计算Openstack Glance

OpenStack Glance&#xff08;或称为Glance&#xff0c;但通常OpenStack官方文档中使用的是“Glance”作为项目代号&#xff09;是OpenStack的镜像服务组件&#xff0c;为创建虚拟机提供镜像服务。以下是对OpenStack Glance的详细解析&#xff1a; 一、基本功能 Glance主要提…

【HTML并不简单】笔记2-你不知道的a元素属性:target、download、ping、referrerpolicy和href

文章目录 target属性download属性ping属性referrerpolicyhref细节自动绝对地址锚点定位无障碍访问为何base元素无人问津实现链接元素a的嵌套 《HTML并不简单&#xff1a;Web前端开发精进秘籍》张鑫旭 笔记 target属性 有场景如下&#xff1a; 在线写作工具经常会有预览功能&a…

源2.0-M32大模型适配AutoGPTQ工具及量化推理教程

AutoGTPQ简介 AutoGPTQ‌是一个开源工具包&#xff0c;专注于简化大规模语言模型(LLMs)的量化过程。它基于高效的GPTQ算法开发&#xff0c;主要使用Python编程语言&#xff0c;并依托PyTorch框架来实现量化功能。AutoGPTQ的设计目标是为开发者和研究人员提供一个易于使用的API接…

【Golang】关于Go语言数学计算、随机数生成模块--math

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

多功能声学气膜馆:承载梦想与希望的舞台—轻空间

在9月29日上午&#xff0c;苏州大学应用技术学院的2024级新生开学典礼暨开学第一课在轻空间建造的多功能声学气膜馆内盛大举行。这一盛典不仅见证了2849名新生的入学&#xff0c;也展示了气膜馆的独特魅力与优越功能。 卓越的声学表现 声学气膜馆采用高性能材料&#xff0c;确保…

Linux-基础实操篇-组管理和权限管理(上)

Linux 组基本介绍 在 linux 中的每个用户必须属于一个组&#xff0c;不能独立于组外。在 linux 中每个文件 有所有者、所在组、其它组的概念。 用户和组的基本概念&#xff1a; 用户名&#xff1a;用来识别用户的名称&#xff0c;可以是字母、数字组成的字符串&#xff0…

解决DHCP服务异常导致设备无法获取IP地址的方法

DHCP在网络环境中会自动为网络中的设备分配IP地址和其他关键网络参数&#xff0c;可以简化网络配置过程。但是&#xff0c;如果DHCP服务出现异常时&#xff0c;设备可能无法正常获取IP地址&#xff0c;会影响到网络通信。 本文讲述一些办法可以有效解决DHCP服务异常导致设备无法…

YAML管理接口框架配置的最佳实践!!

YAML 文件在接口框架中作为配置管理的语言&#xff0c;以其简洁、直观的语法&#xff0c;迅速成为开发者的宠儿。然而&#xff0c;如何高效地管理和组织接口框架的配置&#xff0c;往往是一个容易被忽视的难题。你是否曾因为冗长的配置文件而感到头疼&#xff1f;今天&#xff…