Spring条件化装配Bean

Spring 条件化Bean装配:深入理解 @Conditional 注解 在本文中,我们将深入探讨Spring中的条件化Bean装配机制,重点介绍其中的关键概念和技术。我们将从介绍条件化Bean的基本概念和使用场景开始,逐步深入到@Conditional注解的原理和用法,以及如何自定义条件、组合条件、扩展条件注解等方面。通过本文的学习,读者将能够全面了解Spring中条件化Bean装配的原理和实践,从而更好地应用于自己的项目中,并加深对Spring框架核心功能的理解和应用。 阅读详情

Spring条件化装配Bean

 2017-01-16 |   Visit count 1231484

Spring4引入了@Conditional注解,可配合@Bean或者@Component注解一起使用。

用CET4考试来演示@Conditional注解。

新建考试结果Result接口:

1
2
3
public interface Result {
    public void getResult();
}

实现类CET4:

1
2
3
4
5
public class CET4 implements Result{
    public void getResult() {
        System.out.println("恭喜你通过CET4");
    }
}

定义学生接口:

1
2
3
public interface Student {
    public void exam();
}

实现类XiaoMing:

1
2
3
4
5
6
7
8
9
10
public class XiaoMing implements Student{
    //注入result
    @Autowired(required=false)
    private Result result;
    
    public void exam() {
        if(result == null) System.out.println("抱歉,CET4未通过");
        else result.getResult();
    }
}

配置JavaConfig:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;
 
@Configuration
public class ConditionConfig {
    @Bean
    @Conditional(ResultCondition.class)
    public Result result(){
        return new CET4();
    }
    @Bean(name="xiaoming")
    public Student student(){
        return new XiaoMing();
    }
}

可以看到,@Conditional中给定了一个Class,它指明了条件——在本例中,也就是ResultCondition:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.env.Environment;
import org.springframework.core.type.AnnotatedTypeMetadata;
 
public class ResultCondition implements Condition{
 
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        Environment env = context.getEnvironment();
        //获取环境变量中的result属性
        String result = env.getProperty("result");
        if("success".equals(result)) return true;
        else return false;
    }
}

设置给@Conditional的类可以是任意实现了Condition接口的类型。可以看出来,这个接口实现起来很简单直接,只需提供matches()方法的实现即可。如果matches()方法返回 true,那么就会创建带有@Conditional注解的bean。如果matches()方法返回false,将不会创建这些bean。

ConditionContext是一个接口,大致如下所示:

1
2
3
4
5
6
7
public interface conditioncontext{
    BeanDefinitionRegistry getRegistry();
    ConfigurableListableBeanFactory getBeanFactory();
    ResourceLoader getResourceLoader();
    Environment getEnvironment();
    ClassLoder getClassLoader();
}

通过ConditionContext,我们可以做到如下几点:

1.借助getRegistry()返回的BeanDefinitionRegistry检查bean定义;

2.借助getBeanFactory()返回的ConfigurableListableBeanFactory检查bean是否存在,甚至探查bean的属性;

3.借助getEnvironment()返回的Environment检查环境变量是否存在以及它的值是什么;

4.读取并探查getResourceLoader()返回的ResourceLoader所加载的资源;

5.借助getClassLoader()返回的ClassLoader加载并检查类是否存在。

AnnotatedTypeMetadata则能够让我们检查带有@Bean注解的方法上还有什么其他的注解。像ConditionContext一样,AnnotatedTypeMetadata也是一个接口。它如下所示:

1
2
3
4
5
6
7
8
9
10
public interface AnnotatedTypeMetadata{
    boolean isAnnotated(String annotationType);
    Map<String,Object> getAnnotationAttributes(String annotationType);
    Map<String,Object> getAnnotationAttributes(
            String annotationType,boolean classValuesAsString);
    MutilValueMap<String,Object> getAllAnnotationAttributes(
            String annotationType);
    MutilValueMap<String,Object> getAllAnnotationAttributes(
            String annotationType,boolean classValuesAsString);
}

借助isAnnotated()方法,我们能够判断带有@Bean注解的方法是不是还有其他特定的注解。借助其他的那些方法,我们能够检查@Bean注解的方法上其他注解的属性。

现在测试@Conditional注解的作用:

1
2
3
4
5
6
7
8
public class TestConditional {
    public static void main(String[] args) {
        System.setProperty("result", "fail");
        ApplicationContext ac = new AnnotationConfigApplicationContext(ConditionConfig.class); 
        Student xiaoming = (Student) ac.getBean("xiaoming");
        xiaoming.exam();
    }
}

这里设置result为fail,ResultCondition的matches()方法返回false,所以CET4 Bean并不会被创建,结果应该输出“抱歉,CET4未通过”,测试结果:

1
抱歉,CET4未通过
spring boot中的条件装配bean的实现 主要介绍了spring boot中的条件装配bean的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 立即下载

相关推荐

别再手动调参数了!用3ds Max的tyDiffusion插件,5分钟搞定AI动态纹理生成

本文介绍了3ds Max的tyDiffusion插件如何通过AI技术快速生成动态纹理,大幅提升3D美术师的工作效率。从火焰、水流到布料飘动,tyDiffusion能在5分钟内完成传统手工需要数小时的任务,且效果更自然。文章详细解析了插件的核心功能、实战配置及进阶应用,帮助用户轻松实现AI动态纹理生成。

weixin_30919429的博客 666

Spring进阶_按条件进行Bean装配

spring 按条件进行Bean装配

asxyxxx的博客 973

VTK vtkLookupTable vtkScalarBarActor 颜色条

有时需要给数据做一个 vtkScalarBarActor, 我们把显示的数据的一个 坐标系 来显示 颜色条1.以 Z 显示颜色 效果如下。

q610098308的专栏 4033

3.6 条件装配Bean

Bean初始化前,对某些属性进行校验,满足校验才去装配数据源 为了处理这样的场景,需要用到**@Conditional注解,同时需要配合另外一个接口Condition**(org.springframework.context.annotation.Condition) 使用属性初始化数据库连接池:加入了@Conditional注解,并且配置了类DatabaseConditional @Bean(name = "dataSource", destroyMethod = "close") @Condition

weixin_48954087的博客 363

LVGL按键触发回调函数的完整流程

如果是我的话我会怎么写:例如按键,我先定义一个结构体里面包含ID,事件名等和回调函数的链表节点结构体里面有具体函数的指针,也有指向下一个回调函数的链表节点的指针,初始化一个结构体变量的,通过BSP层来驱动触摸屏幕,再通过中间层与被按下时就会判断是长按还是短按还是其他,改变变量的事件例如:改成长按,生成事件包后再注册你长按的回调函数链表节点,再根据变量的事件到链表中遍历最后实现功能.父容器监听所有子列表项的点击事件,无需为每个列表项单独注册回调。的回调,打印所有事件日志,观察事件触发顺序。

solomonzw的博客 3239

别再只调API了!深度拆解Dify文件上传的两种传参方式(sys.file vs. inputs.upload_file)

本文深度解析Dify平台文件上传的两种传参方式——sys.file与inputs.upload_file,详细对比其设计原理、技术实现及适用场景。通过代码示例和性能分析,帮助开发者在本地大模型应用中做出精准技术选型,提升文件处理效率与系统稳定性。

weixin_29063979的博客 266

Spring条件装配Bean的详细说明,包含核心注解、使用场景、代码示例和对比表格

Spring条件装配Bean的详细说明,包含核心注解、使用场景、代码示例和对比表格

爱的叹息的专栏 1075

ComfyUI安装包运行前准备:安装Git

Git 是一个分布式版本控制系统(Version Control System, VCS),用于跟踪和管理文件(尤其是代码)的变更历史。 简单理解就是,git是用来管理文件的版本的,如果有新的版本,就可以使用git来更新。

聚梦小课堂 2万+

从零搭建开发脚手架 Spring Boot 使用条件装配Bean

文章目录背景实现方式@Profile@Conditional@ConditionalOnXXX 背景 日常开发中,经常会根据具体的环境或者配置做一些动态的Bean装配,来灵活的配置系统的实现。现总结实现的几种方式。 实现方式 @Profile Spring为应用程序准备了Profile这一概念,用来表示不同的环境。例如,我们分别定义开发、测试和生产这3个环境: dev test prod 创建某个Bean时,Spring容器可以根据注解@Profile来决定是否创建。例如,以下配置: @Configur

laker的博客 838

YOLOv11改进策略【损失函数篇】| arXiv2025 TeLU双曲正切指数线性单元 强梯度防消失 + 解析光滑稳训练,极速提升收敛与泛化

本文记录的是。TeLU(Hyperbolic Tangent Exponential Linear Unit)通过。本文利用TeLU激活函数,以x⋅tanhex统一实现正区间强梯度加速收敛与负区间持续梯度避免死神经元,全程保持解析光滑与极低计算开销,,显著提升深度网络在分类、检测、分割、时序任务中的收敛速度、精度与泛化鲁棒性。

Limiiiing的博客 224

使用MATLAB和Simulink来设计并仿真一个智能家居火灾报警系统

智能家居火灾报警系统旨在通过烟雾传感器、温度传感器等设备监测家庭环境,一旦检测到异常情况(如烟雾或温度骤升),立即触发警报并采取相应措施。在这个教程中,我们将使用MATLAB和Simulink来设计并仿真一个智能家居火灾报警系统,包括数据采集、处理以及响应机制。

amy_mhd的博客 162

Spring教程09-条件化的Bean装配

阅读原文 什么叫条件化的Bean装配?有时候我们需要在满足特定的条件下装配一个Bean,比如spring的profile功能,它可以让Bean组件在指定的环境下创建,那么下面我们使用条件化的Bean装配来简单模拟一下profile的功能。 1、条件化Bean装配 要想实现条件化的Bean装配,得使用Spring的@Conditional注解,@Conditional的value值可以是任何实现了C...

冰点IT的博客 308

YOLOv11 模型改进全流程:从代码修改到性能跃升,让你打造专属检测利器

无论是科研中需要发表创新点满满的论文,还是企业里要解决特定场景的检测难题,这套方法都能让你在YOLOv11的基础上打造出“量身定制”的检测模型。别再让通用模型的“平庸性能”限制你的项目上限——现在就动手修改代码,让你的YOLOv11模型在精度、速度或小样本适应能力上实现跨越式提升,用技术突破证明你的AI研发实力!本文将带你从代码层面入手,完成从骨干网络到损失函数的全维度改进,真正掌握让YOLOv11“为你所用”的技术实力。该改进对小样本类别(如数据集中仅占5%的“稀有缺陷”)的识别精度提升显著。

m0_71589036的博客 402

Spring IoC 如何实现条件化装配 Bean?

注解条件主要用途配置文件中属性的值功能开关,按配置切换实现IoC 容器中缺少某个 Bean提供可被用户覆盖的默认实现(兜底 Bean)IoC 容器中存在某个 Bean当某个依赖准备好后,才装配当前 BeanClasspath 中存在某个类检测是否引入了某个依赖库,是开发 starter 的核心当前是 Web 应用环境装配只在 Web 环境下有意义的 Bean自定义Condition类实现高度定制化的、复杂的判断逻辑。

专注于技术分享 567

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Spring中bean的高级装配:Profile、条件化bean、自动装配的歧义性以及bean的作用域

一、环境与profile 在软件开发时,有一个很大的挑战就是将应用程序从一种环境迁移到另一种环境中。在开发阶段中,某些环境相关做法可能并不适合迁移到生产环境中,甚至即便迁移也无法工作。数据库配置,加密算法已经与外部系统的集成时跨环境部署时会发生变化的几个典型例子。 在数据库配置方面,在开发环境中我们可能会使用嵌入式数据库,并且能够加载测试数据;在生产环境中,可能更希望使用JNDI从容器中获取一个D...

码农峰酱 821

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

spring boot 条件化决定是否装配bean

spring boot 条件化决定是否装配bean 1.根据 spring.profiles.active 属性值决定 @Configuration @Profile("dev") public class TestConfig { @Bean //@Profile("dev") public MyBean user(){ return new MyBean(); } } 注解...

weixin_43866295的博客 577

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Spring高级装配,Profile的使用,条件化Bean,解决歧义性

随笔,分类于 乱七八糟 下。阅读于《Spring实战 4》笔记 高级装配 环境 与 Profile 让各个 开发环境 之间切换更加方便。使用 Profile。 配置 profile bean 要使用 profile,你首先要将所有不同的 bean 定义整理到一个或多个profile之中,在将应用部署到每个环境时,要确保对应的profile 处于激活(active)的状态。 @Configuration @Profile("dev") public class A { @Bean("a") publi.

CrazyIdeas的博客 437

010,Spring 条件化装配Bean

条件化装配Bean 1,概述 有的时候我们在开发的时候需要按照条件来装配不同Bean。比如,我们开发一套人力资源管理系统。我们把这个系统分别提供给了公司A和公司B。但是公司A和公司B在导入用户数据的时候需求不同。公司A是导出了一个大的Json的文件给我们,让我们上传这个文件导入。而公司B是导出了一个Excel文件给我们,让我们导入这个文件。这个时候怎么办呢? ...

V哥教育,java技术博客 370

SSM-Spring-Spring装配Bean-条件化装配Bean

SSM-Spring-Spring装配Bean-条件化装配Bean Spring中提供了@Conditional注解实现条件化是否装配bean,这样可以根据条件动态的装配bean; 要判定@Conditional 注解是否该装配bean还需要Condition 接口配合,我们只须实现 Condition 接口,重写matches 方法; 根据matches方法返回的布尔值进行判定@Conditional是否需要装配bean //实现接口Condition public class DataSourceC

weixin_43958223的博客 177

《Spring实战》-第三章:Bean的高级装配(2)-条件化Bean

慢慢来比较快,虚心学技术 1、什么是条件化Bean 在第一节中说到的profile限定了特殊环境下的Bean装载,但是有时候只根据环境进行Bean装配的选择并不一定能满足我们的需求,所以Spring4提供了更加细化的条件话配置Bean,用于对特定条件才可以进行装配的Bean进行配置 2、怎么条件化配置Bean 条件化配置Bean主要依赖于一个注解和一个接口: @Conditional...

Laiguanfu的博客 322

Spring高级装配——条件化的bean

Spring实战中讲解条件化的bean时,所举条件化创建bean的例子: 希望一个或多个bean只有在应用的类路径下包含特定的库时创建; 希望某个bean只有当另外某个特定的bean也声明之后才会创建; 要求某个特定的环境变量设置之后,才会创建某个bean; 设想一种场景:应用部署在多台服务器上,而想应用的其中某个服务只运行在一台服务器上(比如定时任务或者kafka消息监听处理消息等服务),我...

sinat_15051577的博客 339

spring之@Conditional条件化装配bean

一 前言 理解spring的如何根据条件装配bean有助于我们更好使用springboot进行开发,和源码理解; 知识追寻者(Inheriting the spirit of open source, Spreading technology knowledge;) 二 @Conditional 装配bean 思路如下 Spring中提供了@Conditional注解实现条件化是否装配bea...

知识追寻者(Inheriting the spirit of open source, Spreading technology knowledge;) 1080

【Java教程】Day22-09 Spring框架:IoC容器——条件化Bean的创建与装配

​在开发应用程序时,我们常常需要根据不同的环境进行适配。例如,开发环境使用内存数据库以便快速启动,而生产环境使用真正的数据库,如MySQL。如果应用程序能够根据不同的环境配置自动适配,便能够提高灵活性和可维护性。 Spring框架为此提供了@Profile和@Conditional等注解,帮助我们根据不同条件动态加载和装配Bean。本文将介绍如何使用这些功能,使得Spring容器能够根据环境条件灵活地创建和管理Bean。

max202011161630的博客 719

Spring高级装配--条件化的bean

Spring高级装配--条件化的bean

汤键的博客 857

Spring高级装配(二) 条件化的bean

Spring高级装配(二) 条件化的bean 如果你希望一个bean在特定的条件下才会出现: 应用的类路径下包含特定的库时才创建 只有当某个特定的bean也声明之后才会创建 某个特定的环境变量设定之后才创建某个bean 在Spring 4之前,很难实现这...

144

实战Spring高级装配中条件化的bean

条件化的 bean,当某个条件触发时创建的 bean。 目录 什么是条件化的 bean 条件化地配置bean ConditionContext 接口 AnnotatedTypeMetadata 接口 @Profile注解 总结 什么是条件化的 bean 比如: 当应用中包含了特定的库,才创建。 当某个 非当前 bean 声明后,才创建。 当某个 特定的环境变量设置后,才创建。 Spring 4 之前很难实现,Spring 4引入了一个新的@Conditional注解。 条..

Soinice的博客 447
上一篇: maven坐标与依赖
海深不见鲸
博客等级 码龄6年 7粉丝 31原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值