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

Spring Boot条件装配原理

Spring Boot条件装配原理

引言

条件装配是Spring Boot自动配置的核心机制,通过@Conditional及其派生注解,Spring能够根据当前环境、classpath、配置属性等因素智能地决定是否创建某个Bean。本文将深入剖析条件装配的实现原理、各种条件注解的使用方法以及自定义条件注解的开发技巧。

一、@Conditional基础

1.1 原始@Conditional

@Target({ElementType.TYPE, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) public @interface Conditional { Class<? extends Condition>[] value(); } public interface Condition { boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata); }

1.2 条件实现示例

public class DatabaseCondition implements Condition { @Override public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { Environment env = context.getEnvironment(); String dbType = env.getProperty("app.database.type"); return dbType != null && !dbType.isEmpty(); } } @Configuration @Conditional(DatabaseCondition.class) public class DatabaseConfiguration { // 条件满足时才加载 }

二、Spring Boot条件注解

2.1 常用条件注解

@ConditionalOnClass // classpath存在指定类时生效 @ConditionalOnMissingClass // classpath不存在指定类时生效 @ConditionalOnBean // 容器中存在指定Bean时生效 @ConditionalOnMissingBean // 容器中不存在指定Bean时生效 @ConditionalOnProperty // 配置属性满足条件时生效 @ConditionalOnResource // 存在指定资源文件时生效 @ConditionalOnWebApplication // 是Web应用时生效 @ConditionalOnNotWebApplication // 非Web应用时生效 @ConditionalOnExpression // SpEL表达式为true时生效 @ConditionalOnJava // JDK版本满足条件时生效 @ConditionalOnCloudPlatform // 指定云平台时生效

2.2 组合条件

@Configuration @ConditionalOnClass(DataSource.class) @ConditionalOnProperty( prefix = "spring.datasource", name = "url" ) @EnableConfigurationProperties(DataSourceProperties.class) @AutoConfigureAfter({ DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class }) public class DataSourceConfiguration { }

三、@ConditionalOnClass详解

3.1 基本用法

@Configuration @ConditionalOnClass({DataSource.class, JdbcTemplate.class}) public class JdbcTemplateConfiguration { @Bean @ConditionalOnMissingBean(JdbcTemplate.class) public JdbcTemplate jdbcTemplate(DataSource dataSource) { return new JdbcTemplate(dataSource); } }

3.2 间接依赖检测

// 自动检测DataSource的间接依赖 @Configuration @ConditionalOnClass(DataSource.class) // 会自动检测HikariDataSource等 public class DataSourcePoolConfiguration { }

四、@ConditionalOnProperty详解

4.1 完整配置

@Configuration @ConditionalOnProperty( prefix = "myapp.cache", name = "enabled", havingValue = "true", matchIfMissing = false ) public class CacheConfiguration { } @Configuration @ConditionalOnProperty( prefix = "myapp.service", name = {"enabled", "cache.enabled"}, havingValue = "true", matchIfMissing = true ) public class ServiceConfiguration { }

4.2 松散绑定

@Configuration @ConditionalOnProperty( prefix = "myapp.security", name = "sso-enabled" // 支持 ssoEnabled, sso_enabled, SSO_ENABLED ) public class SsoConfiguration { }

五、@ConditionalOnBean详解

5.1 Bean依赖条件

@Configuration public class CacheAutoConfiguration { @Bean @ConditionalOnBean(CacheManager.class) @ConditionalOnMissingBean(name = "customCacheManager") public CacheManager customCacheManager() { return new ConcurrentMapCacheManager(); } }

5.2 搜索策略

@Configuration @ConditionalOnBean( value = DataSource.class, search = Search.LOCAL, // 只搜索当前容器 type = "com.zaxxer.hikari.HikariDataSource" // 特定类型 ) public class HikariConfiguration { }

六、自定义条件注解

6.1 注解定义

@Target({ElementType.TYPE, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Conditional(OnRedisCondition.class) public @interface ConditionalOnRedis { String value() default "localhost"; } public class OnRedisCondition implements Condition { @Override public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { Map<String, Object> attrs = metadata.getAnnotationAttributes( ConditionalOnRedis.class.getName()); String host = (String) attrs.get("value"); Environment env = context.getEnvironment(); String redisHost = env.getProperty("spring.redis.host", "localhost"); return redisHost.equals(host); } }

6.2 复合条件

@Target({ElementType.TYPE, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Conditional({ OnRedisCondition.class, OnCacheEnabledCondition.class }) public @interface ConditionalOnRedisCache { }

七、条件装配顺序

7.1 @AutoConfigureOrder

@Configuration @AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE) @ConditionalOnClass(DataSource.class) public class DataSourceAutoConfiguration { }

7.2 @AutoConfigureAfter

@Configuration @AutoConfigureAfter(DataSourceAutoConfiguration.class) @ConditionalOnClass(JpaEntityManager.class) public class HibernateJpaAutoConfiguration { }

八、条件测试

@SpringBootTest @ConditionalOnProperty(name = "test.enabled", havingValue = "true") class ConditionalTest { @Test void testConditionalBean() { // 测试条件Bean是否存在 } }

总结

条件装配是Spring Boot智能自动配置的基础,通过合理使用条件注解,可以构建灵活、可扩展的自动配置机制。自定义条件注解可以满足特殊场景的需求,但应保持简洁和可维护性。

http://www.jsqmd.com/news/842070/

相关文章:

  • 毕业写作提质利器盘点:9 大 AI 论文创作工具实测,okbiye 稳居实用首选
  • FPGA驱动RGB屏幕时序详解:从VGA原理到480x272分辨率实战调试记录
  • 基于RP2040与CircuitPython打造可编程USB媒体旋钮:从硬件组装到代码自定义
  • TPS61088RHLR升压芯片:从数据手册到实战PCB设计的完整指南
  • Figma中文界面插件:设计师告别英文困扰的终极解决方案
  • Multi-Agent系统生产环境架构设计:可扩展性、高可用与弹性伸缩完整方案
  • 深度强化学习在无人机控制中的挑战与优化策略
  • 项目管理工具在2026年迎来哪些关键变革?
  • 2026Q2全自动啤酒机厂家名录:四川啤酒机设备/四川精酿啤酒供应链/四川精酿啤酒厂家/成都啤酒机供货商/成都精酿啤酒供应链/选择指南 - 优质品牌商家
  • 树莓派/BeagleBone连接TMP006红外测温传感器Python实战指南
  • 静态站点生成器打造个人导航页:配置驱动与自动化部署实践
  • SMARC模块化电脑标准:嵌入式系统设计、选型与集成实战指南
  • 告别硬件SPI!用Arduino模拟SPI搞定LD3320语音识别的完整指南
  • 2026实验室可燃气体报警器检定装置标杆名录:小型可燃气体报警器检定装置/工业用可燃气体报警器检定装置/工业用配气仪/选择指南 - 优质品牌商家
  • 深入解析SuperIO IT8786E/IT8728F看门狗机制:从寄存器操作到Linux Shell脚本实践
  • 2026年度geo优化公司十强分析解读:榜单背后的五维评估解读
  • Pearcleaner:彻底告别macOS应用残留的终极清理指南
  • 基于Keil MDK的USB HID键盘模拟开发指南
  • 从安装到跑通第一个例程:Halcon 20.11深度学习版环境搭建全记录
  • 时间常数τ:从RC公式到系统动态性能的工程直觉
  • vLLM 多 GPU 与分布式推理:从单卡到多节点
  • Legado-Harmony:打造专属你的纯净阅读空间
  • NotebookLM推荐结果突然失焦?48小时内定位并修复LLM嵌入层梯度偏移的紧急响应手册
  • 嵌入式开发调试实战指南:从硬件排查到软件逻辑的完整心法
  • 2026年近期浙江板式换热器选购指南:为何高力科技备受推崇? - 2026年企业推荐榜
  • NotebookLM研究问题生成黄金窗口期仅剩6个月?Gartner 2024预测下,你必须掌握的5项不可替代能力
  • STM32F407 HAL库实战:42步进电机驱动与PWM调速详解
  • MCM通信优化:AI加速器的性能提升关键
  • 车载边缘AI网络中的动态剪枝与强化学习优化
  • 期刊推荐:Journal of Clinical and Translational Pathology(ISSN: 2993-5202)