当前位置: 首页 > article >正文

Spring学习笔记_20——@Profile

@Profile

1. 解释

在实际开发过程中,可以使用@Profile隔离开发环境、测试环境和生产环境,每个环境基本上都是互相隔离的。

开发、测试、生产环境的配置信息,不需要通过手动修改,可以通过@Profile注解实现替换,可以减少项目开发和运维的工作量,可以减少手动修改配置文件导致出现的问题。

使用@Profile注解时,可以在类或方法上标注,Spring容器在启动时会根据当前激活的profile来决定是否创建和注册这些Bean。

2. 场景

  1. 环境特定的配置:在不同的环境(如开发、测试、生产环境)中,可能需要加载不同的配置。使用@Profile注解可以指定某些Bean只在特定的环境被创建。
  2. 功能模块的激活:在大型应用中,可能有一些功能模块只在特定的条件下启用。通过@Profile注解,可以控制这些模块的激活。
  3. 条件化的Bean定义:在某些情况下,可能需要根据不同的条件来定义不同的Bean。@Profile注解允许开发者根据不同的配置文件来定义和注册Bean。
  4. 集成测试:在进行集成测试时,可能需要模拟某些环境或条件。@Profile注解可以用来定义只在测试环境中激活的Bean。
  5. 特性开关:在某些特性还未准备好发布到生产环境时,可以使用@Profile注解来控制这些特性的开关。
  6. 多环境配置分离:在微服务架构中,不同的服务可能需要根据不同的环境来配置不同的Bean。@Profile注解可以帮助实现这种配置的分离。

3. 源码

package org.springframework.context.annotation;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.core.env.AbstractEnvironment;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.core.env.Profiles;
import org.springframework.context.annotation.Conditional;

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Conditional(ProfileCondition.class)
public @interface Profile {
    // 指定环境的标识
    String[] value();
}

4. Demo

  • 注解使用在类上,根据环境配置
@Configuration
@Profile("dev") // 只在开发环境激活
public class DevConfig {
    @Bean
    public DataSource dataSource() {
        // 返回开发环境的DataSource
        return new EmbeddedDatabaseBuilder()
                .setType(EmbeddedDatabaseType.H2)
                .addScript("classpath:schema-dev.sql")
                .addScript("classpath:data-dev.sql")
                .build();
    }
}
@Configuration
@Profile("prod") // 只在生产环境激活
public class ProdConfig {
    @Bean
    public DataSource dataSource() {
        // 返回生产环境的DataSource
        return new DriverManagerDataSource("jdbc:mysql://localhost:3306/mydb", "user", "pass");
    }
}
  • 注解使用在方法上
@Configuration
public class FeatureToggleConfig {

    @Bean
    @Profile("featureXEnabled")
    public FeatureX featureX() {
        return new FeatureX();
    }

    @Bean
    @Profile({"!featureXEnabled"})
    public FeatureY featureY() {
        return new FeatureY();
    }
}
  • 注解使用在类上,根据环境生成指定的Bean
@Component
@Profile("dev") // 只在开发环境激活
public class DevComponent {
    public void printDevInfo() {
        System.out.println("This is a development component.");
    }
}
@Component
@Profile("prod") // 只在生产环境激活
public class ProdComponent {
    public void printProdInfo() {
        System.out.println("This is a production component.");
    }
}
  • 组合使用@Profile注解
@Configuration
@Profile({"dev", "test"}) // 只在开发和测试环境激活
public class DevAndTestConfig {
    // 配置信息
}

http://www.kler.cn/a/376824.html

相关文章:

  • Jmeter——结合Allure展示测试报告
  • 对象池模式
  • Manjaro Linux安装过程简介
  • 安科瑞缪BD-AI变送器高精度 多功能 性价比高
  • Qt6 CMake 中引入 Qt Linguist 翻译功能
  • Qt字符编码
  • C++学习笔记----9、发现继承的技巧(七)---- 转换(2)
  • 区块链介绍
  • keepalive+mysql8双主
  • Java基于SpringBoot+Vue框架的房屋租赁管理系统(附源码,文档)
  • python在word的页脚插入页码
  • springboot 整合 modbus4j
  • Flutter图片控件(七)
  • 个人学习React Native的实际意义探讨
  • 练习LabVIEW第三十三题
  • 【C++】1968. 输出ascii码对应的字符
  • PAT甲级-1052 Linked List Sorting
  • #渗透测试#SRC漏洞挖掘# 信息收集-Shodan进阶之Mongodb未授权访问
  • sql进阶篇
  • 华为云安装docker
  • GNSS和PTP时间同步的基础原理介绍
  • Android 百度面经
  • Golang反射原理
  • 问:Redis常见性能问题及解法?
  • LeetCode每日一题3226---使两个整数相等的位更改次数
  • C#WPF使用CommunityToolkit.Mvvm库