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

SpringBoot的条件装配原理

一.前言

       SpringBoot的条件装配是基于@Conditional注解实现的。下面我们使用原生的@Conditional注解模拟实现类的条件装配。

二.实现思路

1.实现Condition接口

       写一个类实现Condition接口并重写matches方法,matches方法返回的布尔值决MyConditional1是否生效。下面我们模拟DruidDataSource类存在则返回真。

static class MyConditional1 implements Condition {@Overridepublic boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {return ClassUtils.isPresent("com.alibaba.druid.pool.DruidDataSource", null);}}

 同上,但是条件刚好相反,模拟DruidDataSource类不存在则返回真。

 static class MyConditional2 implements Condition {@Overridepublic boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {return !ClassUtils.isPresent("com.alibaba.druid.pool.DruidDataSource", null);}}

2.使用注解@Conditional条件装配自动配置类

         自动配置类生效与否取决于自我实现的MyConditional1、MyConditional2类中match方法的返回值。

    @Configuration@Conditional(MyConditional1.class)static class AutoConfiguration1{@Beanpublic Bean1 Bean1(){return new Bean1();}}@Configuration@Conditional(MyConditional2.class)static class AutoConfiguration2{@Beanpublic Bean2 Bean2(){return new Bean2();}}static class Bean1{}static class Bean2{}

3.测试代码如下

package com.example.springdemo.demos.a08;
import org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration;
import org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext;
import org.springframework.context.annotation.*;
import org.springframework.core.type.AnnotatedTypeMetadata;
import org.springframework.core.type.AnnotationMetadata;
import org.springframework.util.ClassUtils;/*** @author zhou* @version 1.0* @description TODO* @date 2025/8/24 16:11*/
public class TestMyConditional {public static void main(String[] args) {AnnotationConfigServletWebServerApplicationContext context = new AnnotationConfigServletWebServerApplicationContext();context.registerBean("config", Config.class);context.refresh();for(String name : context.getBeanDefinitionNames()){String resource = context.getBeanDefinition(name).getResourceDescription();if(resource != null){System.out.println(name + "来源:"+resource);}}context.close();}@Configuration@Import(MyImportSelector.class)static  class Config{}static class MyImportSelector implements DeferredImportSelector{@Overridepublic String[] selectImports(AnnotationMetadata importingClassMetadata) {return new String[]{AutoConfiguration1.class.getName(),AutoConfiguration2.class.getName(), ServletWebServerFactoryAutoConfiguration.class.getName()};}}static class MyConditional1 implements Condition {@Overridepublic boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {return ClassUtils.isPresent("com.alibaba.druid.pool.DruidDataSource", null);}}static class MyConditional2 implements Condition {@Overridepublic boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {return !ClassUtils.isPresent("com.alibaba.druid.pool.DruidDataSource", null);}}@Configuration@Conditional(MyConditional1.class)static class AutoConfiguration1{@Beanpublic Bean1 Bean1(){return new Bean1();}}@Configuration@Conditional(MyConditional2.class)static class AutoConfiguration2{@Beanpublic Bean2 Bean2(){return new Bean2();}}static class Bean1{}static class Bean2{}}

4.测试结果

       由于我的代码中不存在com.alibaba.druid.pool.DruidDataSource类,所以AutoConfiguration1类配置的Bean1没有生效,所以输出Bean1。现在我们换一个存在的类,代码中的一个类com.example.springdemo.demos.a08.TestMyConditional.AutoConfiguration1,由于该类存在,所以AutoConfiguration1类上的配置生效,AutoConfiguration2类上刚好需要相反的条件,所以不成立。最后打印了Bean1类。

http://www.dtcms.com/a/349832.html

相关文章:

  • SpringBoot3集成Oauth2.1——10重启程序Token失效(RSA持久化)
  • Java项目-苍穹外卖_Day1
  • Visual Studio 2022调试Eigen库查看矩阵与向量的值
  • 大模型知识点之矩阵乘以向量
  • springboot:前后端调用(axios发送异步请求)
  • 那我现在有3个输入 9层神经元 每层神经元数为 3 9 3 5 6 2 3 9 8 请给出我所有的权重矩阵
  • 图论水题5
  • ansible的搭建与安装
  • BIO、NIO 和 AIO
  • 智慧城市SaaS平台/交通设施运行监测系统之桥梁运行监测、城市道路塌陷风险运行监测系统架构内容
  • v-slot 与 slot-scope区别
  • 开源零信任本地化部署实战指南:Keycloak + OpenZiti 完整方案
  • [element-plus] el-table在行单击时获取行的index
  • JAVA高级工程师--云服务模式多租户SAAS项目商业模式架构全景
  • 【数据可视化-98】2025年上半年地方财政收入Top 20城市可视化分析:Python + Pyecharts打造炫酷暗黑主题大屏
  • 【Java基础】快速掌握Java泛型机制:基本概念与具体应用
  • 工具系列:JsonViewKit
  • Frida 加密解密算法实现与应用指南
  • kafka 原理详解
  • 代码随想录算法训练营30天 | ​​01背包理论基础、416. 分割等和子集
  • Radxa Rock 5B vs Rock 5B+ 、香橙派、鲁班猫、正点原子及RK3588 的AI/音视频任务的选择
  • springboot项目每次启动关闭端口仍被占用
  • 第 93 场周赛:二进制间距、重新排序得到 2 的幂、优势洗牌、最低加油次数
  • Agent实战教程:LangGraph相关概念介绍以及快速入门
  • Reachability Query
  • 算法每日一题 | 入门-分支结构-肥胖问题
  • 【modbus学习】野火Modbus主机接收到数据后的完整函数调用流程
  • Ajax笔记(上)
  • Vue3在一个对象的list中,找出update_date最大的一条数据
  • MCP 协议原理与系统架构详解—从 Server 配置到 Client 应用