网站营销主管岗位职责,架构师是做什么的,jsp小型网站开发代码,廊坊seo计费管理1、简述
在 Spring Boot 中#xff0c;Conditional 注解用于实现 条件化 Bean 装配#xff0c;即根据特定的条件来决定是否加载某个 Bean。它是 Spring 框架中的一个扩展机制#xff0c;常用于实现模块化、可配置的组件加载。
本文将详细介绍 Conditional 相关的注解…1、简述
在 Spring Boot 中Conditional 注解用于实现 条件化 Bean 装配即根据特定的条件来决定是否加载某个 Bean。它是 Spring 框架中的一个扩展机制常用于实现模块化、可配置的组件加载。
本文将详细介绍 Conditional 相关的注解包括 ConditionalOnClass、ConditionalOnMissingBean、ConditionalOnProperty 等并结合实际应用示例讲解其使用方式。 2、Conditional 注解概述
Conditional 是 Spring 4 引入的条件装配注解它可以根据外部环境或配置的状态决定是否创建 Bean。
其核心接口是
public interface Condition {boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata);
}任何实现 Condition 接口的类都可以用于自定义条件判断。
Configuration
public class MyConfig {BeanConditional(MyCondition.class) public MyService myService() {return new MyService();}
}其中 MyCondition.class 需要实现 Condition 接口并提供判断逻辑。 3、Spring Boot 内置 Conditional 相关注解
Spring Boot 提供了一些常见的 Conditional 注解简化了条件判断的逻辑
注解作用ConditionalOnClass类路径下存在某个类时才加载该 BeanConditionalOnMissingClass类路径下不存在某个类时才加载该 BeanConditionalOnBean当容器中存在指定 Bean 时才加载当前 BeanConditionalOnMissingBean当容器中不存在指定 Bean 时才加载当前 BeanConditionalOnProperty当指定的配置属性满足条件时才加载当前 BeanConditionalOnExpression当指定的 SpEL 表达式为 true 时才加载当前 BeanConditionalOnJava当 Java 版本符合要求时才加载当前 BeanConditionalOnWebApplication当应用是 Web 应用时才加载当前 BeanConditionalOnNotWebApplication当应用不是 Web 应用时才加载当前 Bean
3.1 ConditionalOnClass 使用示例类路径检测
我们希望在 Spring Boot 项目中当类路径下存在 com.example.MyLibrary 这个类时才注册 MyService 这个 Bean。
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;Configuration
public class MyAutoConfiguration {BeanConditionalOnClass(name com.example.MyLibrary)public MyService myService() {return new MyService();}
}解释
如果 com.example.MyLibrary 存在则 MyService 会被创建。如果 com.example.MyLibrary 不存在则 MyService 不会被加载。
3.2 ConditionalOnMissingBeanBean 缺失时加载
如果用户没有手动定义 MyService则提供一个默认实现。
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;Configuration
public class MyAutoConfiguration {BeanConditionalOnMissingBeanpublic MyService myService() {return new MyService(Default Implementation);}
}解释
如果 Spring 容器中已经存在 MyService则不会创建新的 Bean。只有当 MyService 不存在时才会注册默认实现。
3.3 ConditionalOnProperty基于配置项条件加载 Bean
我们希望 MyService 只有在 app.feature.enabledtrue 时才被创建。
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;Configuration
public class MyAutoConfiguration {BeanConditionalOnProperty(name app.feature.enabled, havingValue true, matchIfMissing false)public MyService myService() {return new MyService();}
}解释
如果 application.properties 中包含 app.feature.enabledtrue则 MyService 会被创建。如果 app.feature.enabledfalse或者该属性未定义则 MyService 不会被加载。
在 application.properties 中启用
app.feature.enabledtrue3.4 ConditionalOnBean存在特定 Bean 时才加载
当 UserService 存在时才创建 OrderService。
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;Configuration
public class OrderServiceConfiguration {BeanConditionalOnBean(UserService.class)public OrderService orderService() {return new OrderService();}
}解释
如果 UserService 存在则 OrderService 也会被创建。如果 UserService 不存在则 OrderService 不会被加载。
3.5 ConditionalOnExpression基于 SpEL 表达式加载
当 server.port 大于 8080 时才创建 AdvancedService。
import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;Configuration
public class AdvancedConfig {BeanConditionalOnExpression(#{T(java.lang.Integer).parseInt(${server.port:8080}) 8080})public AdvancedService advancedService() {return new AdvancedService();}
}解释
server.port 8080 时AdvancedService 会被加载。其他情况下不会创建该 Bean。
在 application.properties 中配置
server.port90903.6 结合 ConditionalOnClass 实现 Starter 组件的热拔插
我们要创建一个 Spring Boot Starter 组件如果用户的 classpath 下存在 RedisTemplate则自动加载 Redis 相关的 Bean。
步骤 创建 Starter 组件
Configuration
ConditionalOnClass(RedisTemplate.class)
public class RedisAutoConfiguration {BeanConditionalOnMissingBeanpublic RedisTemplateString, Object redisTemplate(RedisConnectionFactory factory) {RedisTemplateString, Object template new RedisTemplate();template.setConnectionFactory(factory);return template;}
}应用使用 Starter
dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-data-redis/artifactId
/dependency如果引入 Redis 依赖RedisAutoConfiguration 会自动生效。如果不引入 Redis 依赖则 RedisTemplate 不会被创建。 4、总结
Conditional 及其衍生注解使 Spring Boot 具备了自动配置和热拔插的能力。ConditionalOnClass 可用于判断某个类是否存在常用于 Starter 组件的自动装配。ConditionalOnProperty 适用于基于配置的条件加载增强灵活性。ConditionalOnBean 和 ConditionalOnMissingBean 适用于组件依赖管理。
合理使用这些注解可以构建更加模块化、灵活、可配置的 Spring Boot 应用。