【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.hqwc.cn/news/617090.html

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

相关文章

fastjson 序列化问题

问题: 使用fastjson 的 对同一个JSONObject对象 多次引用后, 通过 JSON.toJSONString() 方法进行json序列化时出现只有第一次的可以成功序列化未json string 字符串, 后面的对象都为引用地址; 示例: public static void main(String[] args) {JSONObject jsonObject new JSON…

【leetcode面试经典150题】28.盛最多水的容器(C++)

【leetcode面试经典150题】专栏系列将为准备暑期实习生以及秋招的同学们提高在面试时的经典面试算法题的思路和想法。本专栏将以一题多解和精简算法思路为主&#xff0c;题解使用C语言。&#xff08;若有使用其他语言的同学也可了解题解思路&#xff0c;本质上语法内容一致&…

代码学习记录42---动态规划

随想录日记part42 t i m e &#xff1a; time&#xff1a; time&#xff1a; 2024.04.14 主要内容&#xff1a;今天开始要学习动态规划的相关知识了&#xff0c;今天的内容主要涉及&#xff1a;最长递增子序列 &#xff1b;最长连续递增序列 &#xff1b;最长重复子数组 ;最长公…

selenium添加代理(有账号密码)

以下为各种尝试的记录&#xff0c;正确实现可直接参考最后一条&#xff01; 1&#xff0c;导入Proxy库来添加capabilities属性&#xff1a;可以访问网站&#xff0c;但ip还是本机ip from selenium import webdriver from selenium.webdriver.chrome.options import Options f…

【C++学习】C++11新特性(第一节)

文章目录 ♫一.文章前言♫二.C11新特性♫一.统一的列表初始化♫二.std::initializer_list♫三.声明♫四.decltype关键字♫五.nullptr♫六.新增加容器---静态数组array、forward_list以及unordered系列♫6.1unordered_map与unoredered_set♫6.2array♫6.3 forward_list&#xff…

【静态分析】静态分析笔记04 - 数据流分析(理论)

参考&#xff1a; 【课程笔记】南大软件分析课程4——数据流分析基础&#xff08;课时5/6&#xff09; - 简书 --------------------------------------------------------------------------- 1. 迭代算法 本质&#xff1a;常见的数据流迭代算法&#xff0c;目的是通过迭代…

pycharm debug 的时候 waiting for process detach

当你使用pycharm debug或者run的时候&#xff0c;突然出现了点不动&#xff0c;然后一直显示&#xff1a;waiting for process detach 可能是以下问题&#xff1a; 1、需要设置Gevent compatible pycharm一直没显示运行步骤&#xff0c;只是出现waiting for process detach-C…

C++11 数据结构2 线性表的链式存储,实现,测试

线性表的链式存储 --单链表 前面我们写的线性表的顺序存储(动态数组)的案例&#xff0c;最大的缺点是插入和删除时需要移动大量元素&#xff0c;这显然需要耗费时间&#xff0c;能不能想办法解决呢&#xff1f;链表。 链表为了表示每个数据元素与其直接后继元素之间的逻辑关系…

Linux系统——Elasticsearch企业级日志分析系统

目录 前言 一、ELK概述 1.ELK简介 2.ELK特点 3.为什么要使用ELK 4.完整日志系统基本特征 5.ELK工作原理 6.Elasticsearch介绍 6.1Elasticsearch概述 6.2Elasticsearch核心概念 7.Logstash介绍 7.1Logstash简介 7.2Logstash主要组件 8.Kibana介绍 8.1Kibana简介 …

Netty学习——高级篇2 Netty解码技术

接上篇&#xff1a;Netty学习——高级篇1 拆包 、粘包与编解码技术&#xff0c;本章继续介绍Netty的其他解码器 1 DelimiterBasedFrameDecoder分隔符解码器 DelimiterBasedFrameDecoder 分隔符解码器是按照指定分隔符进行解码的解码器&#xff0c;通过分隔符可以将二进制流拆分…

C语言基础(四)

C语言基础 一维数组数组初始化全部初始化部分初始化数组的默认值冒泡排序 字符数组 二维数组初始化行数是否可省略列数是否可以省略部分初始化 访问二维字符数组 函数分类库函数自定义函数调用自定义函数函数声明 一维数组 概念&#xff1a;一组数据类型相同的元素的集合 <…

家庭网络防御系统搭建-虚拟机安装siem/securityonion网络连接问题汇总

由于我是在虚拟机中安装的security onion&#xff0c;在此过程中&#xff0c;遇到很多的网络访问不通的问题&#xff0c;通过该文章把网络连接问题做一下梳理。如果直接把securityonion 安装在物理机上&#xff0c;网络问题则会少很多。 NAT无法访问虚拟机 security onion虚拟…