spring中@Conditional注解
2024-09-05 04:55:16
@Conditional是Spring4新提供的注解,它的作用是根据某个条件加载特定的bean。
我们需要创建实现类来实现Condition接口,这是Condition的源码
public interface Condition {
boolean matches(ConditionContext var1, AnnotatedTypeMetadata var2);
}
所以我们需要重写matches方法,该方法返回boolean类型。
首先我们准备根据不同的操作系统环境进行对容器加载不同的bean,先创建Person
public class Person { }
创建实现类LinuxCondition和WindowCondiction,
LinuxCondition:
public class WindowCondiction implements Condition {
@Override
public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
return true;
}
}
WindowCondiction:
public class LinuxCondition implements Condition {
@Override
public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) { return true;
}
}
配置类:给相应的bean加上 @Conditional注解,里面的括号将返回boolean类型,返回true则加载bean
@Configuration
public class MainConfig { @Profile("window")
@Conditional(WindowCondiction.class)
@Bean
public Person person01(){
return new Person("李思",30);
} @Profile("linux")
@Conditional(LinuxCondition.class)
@Bean
public Person person02(){
return new Person("wangwu",35);
}
}
测试:现在是按照linux环境,@Profile注解先匹配linux的bean,再根据@Conditional 返回的类型判断是否加载bean,这里都设置返回true,所以应该打印
Person{name='wangwu', age=35}
public class CondictionTest { @Test
public void test(){
//创建容器
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();
//设置需要激活的环境
applicationContext.getEnvironment().setActiveProfiles("linux");
//设置主配置类
applicationContext.register(MainProfileConfig.class);
//启动刷新容器
applicationContext.refresh(); String[] beanNamesForType = applicationContext.getBeanNamesForType(DataSource.class);
for (String name : beanNamesForType){
System.out.println(name);
}
applicationContext.close();
}
}
如果把LinuxCondition的返回值该为false,会报找不到bean的异常
org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.springbean.Person' available
最新文章
- Web开发技术发展历史
- [转]什么是SPI通信
- WinForm------TreeList修改节点图标和按钮样式
- php中的钩子(hook插件机制)
- js特效
- 分布式架构从零开始========》【基于Java自身技术实现消息方式的系统间通信】
- [Cocos2d-x For WP8]Menu菜单
- 轻松突击ThreadLocal
- qml学习:对象和属性
- HtmlHelper扩展 及 页面编码化
- POJ 3276 Face The Right Way 翻转(开关问题)
- Thread 与 Runnable 混合使用测试
- IT小团队的管理者的突围之道
- Spring Boot(六)集成 MyBatis 操作 MySQL 8
- 如何备份和恢复你的TFS服务器(三)
- MyBatis模糊查询不报错但查不出数据的一种解决方案
- Android教程:在百度地图上画出轨迹
- Node稳定性的研究心得
- 【mysql】主从同步,事务等概念
- jQuery选择器遇上一些特殊字符
热门文章
- 洛谷P2114 起床困难综合症【位运算】【贪心】
- 【概率论】2-2:独立事件(Independent Events)
- pause函数
- 协议基础:SMTP:使用Telnet学习SMTP协议
- python pywin32 安装
- Java并发指南5:JMM中的final关键字解析
- kafka学习汇总系列(一)kafka概述
- RHSA-2018:3059-低危: X.org X11 安全和BUG修复更新
- 《你不知道的JavaScript(上)》笔记——函数作用域和块作用域
- 2019最新 Java商城秒杀系统的设计与实战视频教程(SpringBoot版)_2-2微服务项目的搭建-SpringBoot搭建多模块项目二