SpringBoot 通过@Profile注解配置多环境

news2024/11/20 13:21:57

参考资料

  1. Springboot中的@Profile注解

目录

  • 一. 使用场景
  • 二. 前期准备
  • 三. @Profile注解作用于类上
    • 3.1 配置类
    • 3.2 效果
  • 四. @Profile注解作用于方法上
    • 4.1 定义一个生产环境的注解
    • 4.2 配置类
    • 4.3 效果


一. 使用场景

在Spring中,可以使用配置文件的方式来指定不同环境下所需要的配置信息

⏹application.yml

spring:
  profiles:
  	# 通过active来指定当前所处的开发环境
    active: dev

⏹application-dev.yml

spring:
  datasource:
    url: jdbc:mysql://localhost/myblog-dev
    username: dev
    password: mysql
    driver-class-name: com.mysql.cj.jdbc.Driver

⏹application-product.yml

spring:
  datasource:
    url: jdbc:mysql://localhost/myblog-product
    username: product
    password: mysql
    driver-class-name: com.mysql.cj.jdbc.Driver

但有时候,我们不通过配置文件,而是通过配置类的方式来指定不同环境下的配置信息,
此时就需要用到@Profile注解


二. 前期准备

⏹用来封装数据库信息的Entity

import lombok.Builder;
import lombok.Data;

@Builder
@Data
public class DBInfoEntity {

    private String url;

    private String port;

    private String userName;

    private String password;
}

⏹配置接口

public interface Config {
	
	// 获取数据库信息
    DBInfoEntity getDBInfo();
	
	// 获取系统URL
    String getSystemUrl();
}

三. @Profile注解作用于类上

  • 我们使用@Profile注解分别作用于如下所示的两个配置类上,分别指定devproduct环境下才能起作用。
  • 我们通过@Configuration注解指定两个配置类的Bean名称都是MyConfig,一般情况下会报错,因为Spring的IOC容器中,Bean的名称是唯一的,但是我们使用了@Profile注解指定了开发环境,不满足指定开发环境的配置类不会被添加到Bean中,所以不会报错。

3.1 配置类

import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;

@Configuration("MyConfig")
// 指定开发环境为dev
@Profile("dev")
public class MyConfig1 implements Config {

    @Override
    public DBInfoEntity getDBInfo() {
        return DBInfoEntity.builder()
                .url("https://127.0.0.1")
                .port("8080")
                .userName("devUser")
                .password("110120")
                .build();
    }

    @Override
    public String getSystemUrl() {
        return "https://www.dev.com";
    }
}
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;

@Configuration("MyConfig")
// 指定开发环境为product
@Profile("product")
public class MyConfig2 implements Config {

    @Override
    public DBInfoEntity getDBInfo() {
        return DBInfoEntity.builder()
                .url("https://127.0.0.2")
                .port("8089")
                .userName("prodUser")
                .password("999000")
                .build();
    }

    @Override
    public String getSystemUrl() {
        return "https://www.prod.com";
    }
}

3.2 效果

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;

@Component
public class Test32Controller implements CommandLineRunner {
	
	// 注入接口,会自动从IOC容器中获取该接口的实现类
    @Autowired
    private Config config;
    
    @Override
    public void run(String... args) throws Exception {
        
        DBInfoEntity dbInfo = config.getDBInfo();
        System.out.println(dbInfo);

        String systemUrl = config.getSystemUrl();
        System.out.println(systemUrl);
    }
}

💪💪💪dev环境

在这里插入图片描述

💪💪💪product环境

在这里插入图片描述


四. @Profile注解作用于方法上

4.1 定义一个生产环境的注解

  • @Profile注解作用于自定义注解上时,自定义注解便可标识开发环境,相当于是@Profile(“开发环境名称”)的简写方式。
import org.springframework.context.annotation.Profile;

import java.lang.annotation.*;

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
@Profile("product")
public @interface ProductionAnnotation {
}

4.2 配置类

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;

@Configuration
public class MyConfig3 {
	
	// 开发环境时,才会注入IOC容器
    @Bean
    @Profile("dev")
    public String getNameDev() {
        return "devName";
    }
	
	// 生产环境时,才会注入IOC容器
    @Bean
    @ProductionAnnotation  // 相当于 @Profile("product")
    public String getNameProduct() {
        return "productName";
    }
}

4.3 效果

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Component;

@Component
public class Test32Controller implements CommandLineRunner {

    @Autowired
    private ApplicationContext applicationContext;

    @Override
    public void run(String... args) throws Exception {

        // 判断当前IOC容器中是否存在名称为 getNameDev 的Bean
        boolean getNameDevExist = applicationContext.containsBean("getNameDev");
        if (getNameDevExist) {
            // 从IOC容器中获取出名称为 getNameDev 的Bean
            Object bean1 = applicationContext.getBean("getNameDev");
            System.out.println("目前所在的是开发环境!");
            System.out.println(bean1);
        }

        boolean getNameProductExist = applicationContext.containsBean("getNameProduct");
        if (getNameProductExist) {
            Object bean2 = applicationContext.getBean("getNameProduct");
            System.out.println("目前所在的是生产环境!");
            System.out.println(bean2);
        }
    }
}

💪💪💪dev环境

在这里插入图片描述

💪💪💪product环境

在这里插入图片描述

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

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

相关文章

让AI写今年高考作文,满分60你给AI打多少分呢?

随着高考的落幕,各地高考作文已成为我们讨论的话题。 下面是2023年全国甲卷作文题目 我们就让AI根据要求,写上两篇作文。作文标题也是AI起的 一 、① 标题:与时间赛跑,不为时间所困 ​ 时间,这位无情的审判长&#…

知识点滴 - Tumble test和Drop test

翻滚测试(Tumble test)和跌落测试(Drop test)是十分重要的方法,用于评估产品的维持功能的能力,针对的是当产品在终端用户手中的整个生命周期中经历许多碰撞和刮擦的情况。 跌落测试的随机性较强,而跌落测试可以控制跌落方向、撞击点等。 翻滚…

将一个正整数分解质因数(Java)

题目:将一个正整数分解质因数。例如:输入1023,打印出10233*11*31。 目录 1、解题思路 2、程序代码 3、程序输出 1、解题思路 从最小的质数开始,不断地将输入的正整数进行分解,直到无法再分解为止。具体实现方法为:从…

Flutter调用Rust代码操作指南

在之前的利用Rust与Flutter开发一款小工具文章中,我们使用Rust代码实现了一个简单的WebSocket发送功能。也在Rust库交叉编译以及在Android与iOS使用这篇中介绍了Rust库的打包以及双端的使用。 今天我们继续用之前WebSocket的代码举例,来介绍如何在Flutt…

chatgpt赋能python:Python怎么取出换行的数据?

Python怎么取出换行的数据? 在数据分析和处理中,我们常常需要从文件中读取数据,特别是当数据量很大时更是如此。在Python中,读取文本文件中的数据很简单,但是有时候读取的文本文件中可能含有换行符,这可能…

5.DIY可视化-拖拽设计1天搞定主流小程序-公告管理

1.DIY可视化-拖拽设计1天搞定主流小程序-公告管理 公告管理-本教程均在第一节中项目启动下操作 1.DIY可视化-拖拽设计1天搞定主流小程序-公告管理2.创建数据表执行: php think diygw:tableandapi oneHdp 3. 复制幻灯片界面进行编辑4.修改后台API5.富文本添加6.验证 :访问url : …

linux下动态链接过程

序 总是在工作中会遇到符号表,链接等字眼,之前看过《程序员自我修养》这本书,但是基本上都忘记了,这几天再刷一遍,顺便记录一下,加深记忆。 本文会完整的描述程序运行的动态加载及运行的整个流程&#xff…

大学生心理健康APP的设计与实现

摘 要:大学生群体本该是象牙塔中的学习者,是祖国未来的支柱,是民族复兴的期望所在,但是近几年大学生心理健康问题日益严峻,例如情感问题,原生家庭的问题,学业问题,与同学相处所带来…

【ps】photoshop 入门

文章目录 Adobe Photoshop 安装快捷键照片裁剪保存/导出图片复制图层新建图层及颜色填充人物轮廓调整、增高颅顶人物瘦脸、缩小鼻翼、丰唇、放大眼睛人物祛痘/祛斑背景杂质去除图像提亮调色工具 Adobe Photoshop 安装 参照 【Adobe Photoshop 2023 v24.3.0【附安装破解教程】中…

串口通讯,三种数据传输方式介绍

前言 (1)备考微机原理,这里就把这个知识点分享给和我一样不认真上课的同学们。 (2)虽然在我的STM32串口通讯的教程里面已经有描述这部分的内容了。但是担心有些人只是想单纯的了解这个知识点,所以我就又单独…

【工具】putty下载、安装、使用和常用设置教程

一,Putty简介 Putty是一个远程登录工具,适用于 Windows 和 Unix 平台的Telnet、SSH和 RLOGIN客户端。 跨平台支持:PuTTY 可以在多个操作系统上运行,包括 Windows、Linux、Mac 等,使得在不同的平台上使用相同的工具成为…

YOLOV1——你总能在这找到你想要的答案

目录 一:前言 与传统的RCNN的区别在哪? 二:YOLO-V1中心思想 三:计算损失 (1):位置损失 为什么高宽要加上根号的损失? (2):置信度损失 &a…

一次虚拟机centos7系统崩溃恢复记录

前两天,因为单独断开电源测试网络,结果不知道为什么,两台虚拟机中一台就出现紧急状态,看日志是下面情况 通过网上一些资料,说可以通过xfs_repair -v -L /dev/dm-0来修复,但这次我这里没有相关 看这个mappe…

【Docker】docker部署前Springboot-vue后端分离项目【实战篇】

文章目录 1、docker 安装jdk2、docker 安装mysql通过Docker命令进入Mysql容器内部初始化数据sqlDbx连接查看 3、docker build构建后端镜像修改配置数据库JDBC链接IP为虚拟机服务器IPmaven clean package打包后端jar并上传到服务器编写Dockfilebuild 构建查看构建的后端镜像app …

AAOS系列之音量设置

文章目录 前言UI 处理流程音量键的响应流程AudioService设置音量流程AAOS音量条选项总结 前言 AAOS音量设置内容可以分为几个部分 音量的ui响应流程legacy模式dynamic模式通过按键进行设置 AAOS 音量设置比通用的Android系统复杂,表现在两个方面。首先是UI响应上…

chatgpt赋能python:如何取出带有4的整数

如何取出带有4的整数 Python是一门功能强大的编程语言,可以轻松解决复杂的编程问题。在本文中,我们将介绍如何使用Python编程语言从一个整数列表中取出所有带有4的整数。我们将从介绍如何创建一个整数列表开始,然后编写Python代码以实现我们…

Unreal 5 实现丢弃武器功能

之前实现了物品的拾取功能,但是没有实现丢弃功能,这一篇讲一下我是如何实现丢弃功能的。 丢弃功能的逻辑是:拾取物品时,需要使用拾取的物品进行类的实现,所以,我们需要把数据存储到拾取的物品上&#xff0c…

4.DIY可视化-拖拽设计1天搞定主流小程序-后台设计幻灯

后台设计幻灯:本教程均在第一节中项目启动下操作 1.首页幻灯片php安装:phpthink安装: 2.数据库创建:幻灯片表:项目根目录下cmd :执行 : php think diygw:tableandapi oneHdp查看结果目录:访问url: http://one.com/one/api.hdp/list 3.界面增删…

【6.10 代随_53day】 最长公共子序列、不相交的线、最大子数组和

最长公共子序列、不相交的线、最大子数组和 最长公共子序列动态规划方法图解步骤代码 不相交的线动态规划方法 最大子数组和图解步骤代码 最长公共子序列 力扣连接:1143. 最长公共子序列(中等) 动态规划方法 确定递推公式 主要就是两大情况…

《横向联邦学习中 PCA差分隐私数据发布算法》论文算法原理笔记

论文地址:https://www.arocmag.com/article/01-2022-01-041.html 论文摘要 为了让不同组织在保护本地敏感数据和降维后发布数据隐私的前提下,联合使用 PCA进行降维和数据发布,提出横向联邦 PCA差分隐私数据发布算法。引入随机种子联合协商方…