@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

最新文章

  1. Web开发技术发展历史
  2. [转]什么是SPI通信
  3. WinForm------TreeList修改节点图标和按钮样式
  4. php中的钩子(hook插件机制)
  5. js特效
  6. 分布式架构从零开始========》【基于Java自身技术实现消息方式的系统间通信】
  7. [Cocos2d-x For WP8]Menu菜单
  8. 轻松突击ThreadLocal
  9. qml学习:对象和属性
  10. HtmlHelper扩展 及 页面编码化
  11. POJ 3276 Face The Right Way 翻转(开关问题)
  12. Thread 与 Runnable 混合使用测试
  13. IT小团队的管理者的突围之道
  14. Spring Boot(六)集成 MyBatis 操作 MySQL 8
  15. 如何备份和恢复你的TFS服务器(三)
  16. MyBatis模糊查询不报错但查不出数据的一种解决方案
  17. Android教程:在百度地图上画出轨迹
  18. Node稳定性的研究心得
  19. 【mysql】主从同步,事务等概念
  20. jQuery选择器遇上一些特殊字符

热门文章

  1. 洛谷P2114 起床困难综合症【位运算】【贪心】
  2. 【概率论】2-2:独立事件(Independent Events)
  3. pause函数
  4. 协议基础:SMTP:使用Telnet学习SMTP协议
  5. python pywin32 安装
  6. Java并发指南5:JMM中的final关键字解析
  7. kafka学习汇总系列(一)kafka概述
  8. RHSA-2018:3059-低危: X.org X11 安全和BUG修复更新
  9. 《你不知道的JavaScript(上)》笔记——函数作用域和块作用域
  10. 2019最新 Java商城秒杀系统的设计与实战视频教程(SpringBoot版)_2-2微服务项目的搭建-SpringBoot搭建多模块项目二