【spring】@Profile注解学习

@Profile介绍

在Spring框架中,@Profile注解用于根据特定的配置文件来有条件地激活或禁用Bean的定义。这在开发和测试过程中非常有用,因为它允许你为不同的环境(如开发、测试、生产)定义不同的配置。

@Profile不仅可以标注在方法上,也可以标注在配置类上。如果标注在配置类上,只有在指定的环境时,整个配置类里面的所有配置才会生效。如果一个Bean上没有使用@Profile注解进行标注,那么这个Bean在任何环境下都会被注册到IOC容器中。

@Profile源码

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Conditional(ProfileCondition.class)
public @interface Profile {String[] value();
}
源代码截图

@Profile属性介绍

  • value:指定环境的标识。

@Profile注解使用场景

1. 多环境配置

在实际开发过程中,通常会有开发、测试和生产等多个不同的运行环境。每个环境都有其特定的配置需求,如数据库连接信息、服务器地址等。通过使用@Profile注解,可以为不同的环境定义专属的配置类,从而实现多环境的灵活切换和管理。

2. 条件化Bean创建

有时候,某些Bean可能只在特定的条件下需要被创建。例如,你可能需要在测试环境中创建一些用于测试的辅助Bean,而在生产环境中则不需要。利用@Profile注解,可以仅在满足特定条件时创建这些Bean。

3. 功能开关

在某些情况下,可能需要根据环境或条件启用或禁用某些功能。通过@Profile注解,可以在配置类或者Bean定义的方法上设置条件,从而实现功能的动态开关。

4. 环境特定的安全性配置

安全性配置往往根据环境的不同而有所差异。例如,在开发环境中,可能需要关闭某些安全检查以便于调试;而在生产环境中,则需要开启所有的安全措施。使用@Profile注解可以对安全性相关的Bean进行条件化配置。

5. 集成测试环境配置

在进行集成测试时,可能需要一些专门为测试设计的配置,如模拟的外部服务、测试数据库等。通过为测试环境定义特定的Profile,并在其中包含相关的测试配置和Bean,可以方便地进行集成测试。

6. 动态配置

在运行时,可能需要根据外部条件(如系统属性、环境变量、命令行参数等)动态地改变应用程序的行为。@Profile注解可以结合这些动态输入来激活或禁用特定的配置。

7. 灰度发布

在进行灰度发布时,可能需要为一部分用户或服务器启用新的功能或配置,而其他用户或服务器则继续使用旧的配置。通过定义不同的Profile并根据用户或服务器的特征来激活相应的Profile,可以实现灰度发布的配置管理。

8. 性能监控与日志配置

在开发和测试环境中,通常需要开启详细的日志记录和性能监控,以便于发现和调试问题。而在生产环境中,则可能只需要记录关键的错误信息和性能指标。通过@Profile注解,可以根据环境来配置不同的日志级别和性能监控策略。

@Profile测试示例代码

示例代码 一
ProfileDemo类
package com.yang.SpringTest.annotation.profileLearn;import lombok.Data;
import lombok.extern.slf4j.Slf4j;/*** <p>ProfileDemo类</p>** @author By: chengxuyuanshitang* Package com.yang.SpringTest.annotation.profileLearn* Ceate Time 2024-04-09 17:37*/
@Data
@Slf4j
public class ProfileDemo {private String environment;public ProfileDemo (String environment) {this.environment = environment;}
}
ProfileDemoConfig配置类
package com.yang.SpringTest.annotation.profileLearn;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;/*** <p>ProfileDemoConfig配置类</p>** @author By: chengxuyuanshitang* Package com.yang.SpringTest.annotation.profileLearn* Ceate Time 2024-04-09 17:38*/
//@Profile("development")
@Configuration
@ComponentScan(value = {"com.yang.SpringTest.annotation.profileLearn"})
public class ProfileDemoConfig {@Profile("development")@Bean("profileBeanDev")public ProfileDemo profileBeanDev(){return new ProfileDemo("开发环境");}@Profile("test")@Bean("profileBeanTest")public ProfileDemo profileBeanTest(){return new ProfileDemo("测试环境");}@Profile("production")@Bean("profileBeanProd")public ProfileDemo profileBeanProd(){return new ProfileDemo("生产环境");}
}
ProfileDemoTest测试类
package com.yang.SpringTest.annotation.profileLearn;import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;/*** <p>ProfileDemoTest测试类</p>** @author By: chengxuyuanshitang* Package com.yang.SpringTest.annotation.profileLearn* Ceate Time 2024-04-09 17:40*/
@Slf4j
public class ProfileDemoTest {public static void main (String[] args) {AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext ();context.getEnvironment ().setActiveProfiles ("test");context.register (ProfileDemoConfig.class);context.refresh ();ProfileDemo demo = context.getBean (ProfileDemo.class);log.info ("ProfileDemo is : [ {} ]", demo);}
}
运行结果

示例代码 二

上面一样,在ProfileDemoConfig配置类填写@Profile("development")

ProfileDemoConfig配置类
package com.yang.SpringTest.annotation.profileLearn;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;/*** <p>ProfileDemoConfig配置类</p>** @author By: chengxuyuanshitang* Package com.yang.SpringTest.annotation.profileLearn* Ceate Time 2024-04-09 17:38*/
@Profile("development")
@Configuration
@ComponentScan(value = {"com.yang.SpringTest.annotation.profileLearn"})
public class ProfileDemoConfig {@Profile("development")@Bean("profileBeanDev")public ProfileDemo profileBeanDev(){return new ProfileDemo("开发环境");}@Profile("test")@Bean("profileBeanTest")public ProfileDemo profileBeanTest(){return new ProfileDemo("测试环境");}@Profile("production")@Bean("profileBeanProd")public ProfileDemo profileBeanProd(){return new ProfileDemo("生产环境");}
}
运行结果

出现错误No qualifying bean of type 'com.yang.SpringTest.annotation.profileLearn.ProfileDemo' available

修改ProfileDemoTest测试类

把setActiveProfiles ("test")

package com.yang.SpringTest.annotation.profileLearn;import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;/*** <p>ProfileDemoTest测试类</p>** @author By: chengxuyuanshitang* Package com.yang.SpringTest.annotation.profileLearn* Ceate Time 2024-04-09 17:40*/
@Slf4j
public class ProfileDemoTest {public static void main (String[] args) {AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext ();context.getEnvironment ().setActiveProfiles ("development");context.register (ProfileDemoConfig.class);context.refresh ();ProfileDemo demo = context.getBean (ProfileDemo.class);log.info ("ProfileDemo is : [ {} ]", demo);}
}
运行结果

当@Profile注解标注到类上时,虽然类中的方法上也标注了@Profile注解,但是整体上会以类上标注的@Profile注解为准。如果设置的环境标识与类上标注的@Profile注解中的环境标识不匹配,则整个类中的配置都不会生效。否则,类中没有使用@Profile注解标识的Bean和环境标识与方法上使用@Profile注解指定的环境标识匹配的Bean才会生效。




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

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

相关文章

【MATLAB源码-第184期】基于matlab的FNN预测人民币美元汇率 输出预测图误差图RMSE R2 MAE MBE等指标

操作环境&#xff1a; MATLAB 2022a 1、算法描述 前馈神经网络&#xff08;Feedforward Neural Network, FNN&#xff09;是最简单也是应用最广泛的人工神经网络之一。在许多领域&#xff0c;尤其是数据预测方面&#xff0c;FNN已经展现出了卓越的性能和强大的适应性。 一、…

【论文速读】| MASTERKEY:大语言模型聊天机器人的自动化越狱

本次分享论文为&#xff1a;MASTERKEY: Automated Jailbreaking of Large Language Model Chatbots 基本信息 原文作者&#xff1a;Gelei Deng, Yi Liu, Yuekang Li, Kailong Wang, Ying Zhang, Zefeng Li, Haoyu Wang, Tianwei Zhang, Yang Liu 作者单位&#xff1a;南洋理工…

13 指针(上)

指针是 C 语言最重要的概念之一&#xff0c;也是最难理解的概念之一。 指针是C语言的精髓&#xff0c;要想掌握C语言就需要深入地了解指针。 指针类型在考研中用得最多的地方&#xff0c;就是和结构体结合起来构造结点(如链表的结点、二叉树的结点等)。 本章专题脉络 1、指针…

ht1622不显示无反应问题解决

如果你正在写ht1622 驱动时&#xff0c;怎么看程序都没问题&#xff0c;抓取波形&#xff0c;示波器分析波形&#xff0c;如果都没有问题&#xff0c;那么很大可能是硬件问题&#xff0c;检测看看 ht1622 RD是不是接地了。 RD 低会进入读取模式&#xff0c;所以不用RD 请将RD悬…

Harmony鸿蒙南向驱动开发-RTC

RTC&#xff08;real-time clock&#xff09;为操作系统中的实时时钟设备&#xff0c;为操作系统提供精准的实时时间和定时报警功能。当设备下电后&#xff0c;通过外置电池供电&#xff0c;RTC继续记录操作系统时间&#xff1b;设备上电后&#xff0c;RTC提供实时时钟给操作系…

pandas 给指定行赋值

pandas 赋值 在Pandas中&#xff0c;可以使用多种方式进行赋值操作。以下是一些常见的赋值操作示例&#xff1a; 给单个元格赋值&#xff1a; import pandas as pd df pd.DataFrame({‘A’: [1, 2, 3], ‘B’: [4, 5, 6]}) df.at[0, ‘A’] 100 # 给第一行"A"列…

Java 判断日期是否为工作日

import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; //判断日期是否是工作日&#xff08;0 上班 1周末 2节假日&#xff09; SimpleDateFormat fnew SimpleDateForm…

Python:如何对FY3D TSHS的数据集进行重投影并输出为TIFF文件以及批量镶嵌插值?

完整代码见 Github&#xff1a;https://github.com/ChaoQiezi/read_fy3d_tshs&#xff0c;由于代码中注释较为详细&#xff0c;因此博客中部分操作一笔带过。 01 FY3D的HDF转TIFF 1.1 数据集说明 FY3D TSHS数据集是二级产品(TSHS即MWTS/MWHS 融合大气温湿度廓线/稳定度指数/…

【Vue】组件

在Vue.js中&#xff0c;组件是可复用的Vue实例&#xff0c;它可以封装特定的功能和界面&#xff0c;并能在应用程序中多次使用。组件允许您将应用程序拆分为多个小的、独立的部分&#xff0c;每个部分都有自己的模板、逻辑和样式。 之前处理多个用户数据时&#xff0c;每个用户…

第十一届蓝桥杯省赛真题(C/C++大学B组)

试题A &#xff1a;门牌制作 #include <bits/stdc.h> using namespace std;const int N 100000; int arr[N];int main() {int ans 0,t;for(int i 1;i < 2020;i){t i;while(t > 0){if(t % 10 2) ans;t / 10;}}cout<<ans<<endl;return 0; } 试题B …

Harmony鸿蒙南向驱动开发-MMC

MMC&#xff08;MultiMedia Card&#xff09;即多媒体卡&#xff0c;是一种用于固态非易失性存储的小体积大容量的快闪存储卡。 MMC后续泛指一个接口协定&#xff08;一种卡式&#xff09;&#xff0c;能符合这种接口的内存器都可称作MMC储存体。主要包括几个部分&#xff1a;…

什么是iframe?请讲述一下iframe框架的优缺点?

iframe是HTML中的一个标签&#xff0c;全称为inline frame&#xff0c;即内联框架。它可以在网页中嵌入其他页面或文档&#xff0c;将其他页面的内容以框架的形式展示在当前页面中。iframe的使用方式是通过在HTML文档中插入iframe标签&#xff0c;并设置相应属性来指定要嵌入的…

zsh安裝教程

安裝zsh&#xff1a; 你可以使用包管理器來安裝zsh。例如&#xff0c;在Debian/Ubuntu系統上&#xff0c;你可以運行以下命令&#xff1a; sudo apt-get install zsh在Fedora系統上&#xff0c;你可以運行以下命令&#xff1a; sudo dnf install zsh在macOS上&#xff0c;你可以…

[lesson17]对象的构造(上)

对象的构造(上) 对象的初始化 从程序设计的角度&#xff0c;对象只是变量&#xff0c;因此&#xff1a; 在栈上常见对象时&#xff0c;成员变量初始为随机值在堆上创建对象时&#xff0c;成员变量初始为随机值在静态存储区创建对象时&#xff0c;成员变量初始为0值 生活中的对…

PyTorch学习之:高级神经网络模型和技术

CNN的构建和应用 构建和应用卷积神经网络&#xff08;CNN&#xff09;进行图像分类是深度学习中的一个核心任务。这个过程涉及到定义网络架构、数据准备、模型训练、评估和应用等多个步骤。下面&#xff0c;我将详细解释这些步骤&#xff1a; 1. 定义CNN架构 CNN通常包含以下…

[Java基础揉碎]Arrays类

目录 Arrays常见方法 1) toString返回数组的字符串形式 Arrays.toString(arr) 2) sort 排序(自然排序和定制排序) Integer arr[] {1,-1,7,0,89}; 定制排序 查看源码 冒泡排序 3) binarySearch 通过二分搜索法进行查找下标&#xff0c;要求必须排好序 int index Arra…

【MATLAB源码-第29期】基于matlab的MIMO,MISO,SIMO,SISO瑞利rayleigh信道容量对比。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 1. SISO&#xff08;单输入单输出&#xff09;&#xff1a; - SISO 是指在通信系统中&#xff0c;只有一个天线用于传输信号&#xff0c;也只有一个天线用于接收信号的情况。这是最简单的通信方式。 2. SIMO&#xff08;单…

2024年河北省职业院校技能大赛高职组“信息安全管理与评估”赛项样题

培训、环境、资料、考证 公众号&#xff1a;Geek极安云科 网络安全群&#xff1a;775454947 网络系统管理群&#xff1a;223627079 网络建设与运维群&#xff1a;870959784 极安云科专注于技能提升&#xff0c;赋能 2024年广东省高校的技能提升&#xff0c;受赋能的客户院校均…

网络基础三——其他周边问题

3.1ARP原理 ​ ARP不是一个单纯的数据链路层的协议&#xff0c;而是一个介于数据链路层和网络层之间的协议&#xff1b; ​ 以广播的形式(主机号填成全1)构建Mac帧&#xff0c;发送ARP请求包&#xff0c;告诉所有在局域网的主机我的IP地址和Mac帧&#xff0c;与目的IP相同的主…

08 Php学习:iff语句、Switch语句

PHP 条件语句 当您编写代码时&#xff0c;您常常需要为不同的判断执行不同的动作。您可以在代码中使用条件语句来完成此任务。 在 PHP 中&#xff0c;提供了下列条件语句&#xff1a; if 语句 - 在条件成立时执行代码 if…else 语句 - 在条件成立时执行一块代码&#xff0c;…