spring之@Conditional条件化装配bean
一 前言
理解spring的如何根据条件装配bean有助于我们更好使用springboot进行开发,和源码理解;
知识追寻者(Inheriting the spirit of open source, Spreading technology knowledge;)
二 @Conditional 装配bean
思路如下
- Spring中提供了
@Conditional
注解实现条件化是否装配bean,这样可以根据条件动态的装配bean; - 要判定
@Conditional
注解是否该装配bean还需要Condition 接口配合,我们只须实现 Condition 接口,重写matches 方法; - 根据matches方法返回的布尔值进行判定
@Conditional
是否需要装配bean
实现过程如下
2.1 用户类
用户类用于配置类是否装配该Bean
/**
* @Author lsc
* <p> </p>
*/
public class User {
private String userName;
// 省略 set get
}
2.2 Condition实现类
RuntimeExist 实现 Condition ,使用 conditionContext 获取jvm 环境变量,如果存在则返回 true ,否则返回false;其中conditionContext还有如下方法
- getRegistry():使用BeanDefinitionRegistry的检查bean定义;
- getBeanFactory():使用ConfigurableListableBeanFactory检查bean是否存在;
- getEnvironment():Environment环境变量
- getResourceLoader():ResourceLoader加载的资源;
- getClassLoader():ClassLoader加载的类。
public class RuntimeExist implements Condition {
public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
// 获取jvm 运行时环境
Environment environment = conditionContext.getEnvironment();
// 检查 jvm 运行时环境是否存在属性
return environment.containsProperty("java.runtime.name");
}
}
2.3 用户配置类
根据 RuntimeExist的 matches 方法的返回值 是否装配bean; 这边设置了属性名称 zszxz,以便于更好的测试;
/**
* @Author lsc
* <p> </p>
*/
@Configuration
public class UserConfig {
@Bean
// 根据 RuntimeExist的 matches 方法的返回值 是否装配bean
@Conditional(RuntimeExist.class)
public User user(){
User user = new User();
user.setUserName("zszxz");
return user;
}
}
2.4 测试
由于 jvm 运行时环境存在 java.runtime.name 属性 ,故会装配成功,会打印出 zszxz ;
如果将 java.runtime.name 改为 任意jvm 运行时不存在的属性 ,测试就会报异常;
@RunWith(SpringJUnit4ClassRunner.class)//创建spring应用上下文
@ContextConfiguration(classes= UserConfig.class)//加载配置类
public class ConditionTest {
@Autowired
User user;
@Test
public void test(){
// zszxz
System.out.println(user.getUserName());
}
}
源码地址:公众号汇总文章处
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix