spring4.0引入的新特性,当你注册bean时,可以对这个bean添加一定的自定义条件,当满足这个条件时,注册这个bean,否则不注册。

Condition源码:

public interface Condition {boolean matches(ConditionContext var1, AnnotatedTypeMetadata var2);
}

实现接口,重写matches方法,返回true则注册被注解的bean,false则跳过被注解的bean。

举个栗子:我们的系统中,如果注册了Cat类,就不要注册Dog类了。

例子来源:https://blog.csdn.net/helianus/article/details/78753452

public class Animal {private String name;public String getName() {return getClass().getName();}public void setName(String name) {this.name = name;}
}
public class Cat extends Animal{
}
public class Dog extends Animal{
}
public class Person {private String name;@Autowiredprivate  Animal animal;public Animal getAnimal() {return animal;}public void setAnimal(Animal animal) {this.animal = animal;}public String getName() {return name;}public void setName(String name) {this.name = name;}}
@Configuration
public class BeanConfig {@Beanpublic Person person(){return new Person();}@Beanpublic Cat cat(){return new Cat();}@Bean//创建这个bean的必要条件,matches方法必须为true才会注册bean,反之忽略bean。//扫描到bean立刻调用,不会等配置类中的所有bean都注册好之后再调用,因此Cat bean写前面,写后面会出错。@Conditional({PetCondition.class})public Dog dog(){return new Dog();}}

上面为配置类,此配置类的dog方法添加了conditional注解,即注册dog类的这个bean的条件是PetCondition.class定义的条件

PetCondition类:

public class PetCondition implements Condition {public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {//输出 org.springframework.core.type.StandardMethodMetadataSystem.out.println(annotatedTypeMetadata.getClass().getName());//强转StandardMethodMetadata standardMethodMetadata = (StandardMethodMetadata)annotatedTypeMetadata;//AppConfig下的dog方法调用,输出dogSystem.out.println(standardMethodMetadata.getMethodName());//如果personreturn conditionContext.getRegistry().containsBeanDefinition("person") && !conditionContext.getRegistry().containsBeanDefinition("cat");//conditionContext.getRegistry()获取注册的bean//conditionContext.getBeanFactory()获取提供bean definition的解析,注册功能,再对单例来个预加载(解决循环依赖问题).//conditionContext.getEnvironment()获取环境配置//conditionContext.getResourceLoader()ResourceLoader所加载的资源//conditionContext.getClassLoader()获取类加载器//        annotatedTypeMetadata.//annotatedTypeMetadata 被加上注解的源数据信息。比如annotatedTypeMetadata.}}

测试:

ApplicationContext context = new AnnotationConfigApplicationContext(BeanConfig.class);Person person = (Person)context.getBean("person");System.out.println(person.getAnimal().getName());

输出:

org.springframework.core.type.StandardMethodMetadata
dog
com.demo.entity.Cat

配置类中注册了Animal的两种实现类,并且我们没有缩小bean的定义,并没有报错。因为在注册Dog的时候我们做了条件化判断,发现已经注册了Cat,跳过了Dog的注册,所以整个系统中Animal的子类只有Cat,Person类成功注入Cat。

如项目有使用Condition条件的地方,可以直接参考这个例子使用。

Spring Condition条件使用示例相关推荐

  1. 【Spring注解系列04】@Condition条件注解

    1.@Condition条件注解 满足指定条件,则会加载对应的实例或者类.该注解可以作用于类和方法上. @Condition类属性值中,对应的类,必须是实现Condition接口的类 2.实例 配置类 ...

  2. Spring注解大全(示例详解)

    Controller 标识一个该类是Spring MVC controller处理器,用来创建处理http请求的对象. @Controller public class TestController ...

  3. Spring Boot 缓存教程示例

    在本Spring Boot 教程中,学习如何从 Spring 框架缓存支持中轻松管理应用程序缓存.Spring 在缓存方面有一些很好的特性,Spring 缓存 API 的抽象使用起来非常简单. 1.缓 ...

  4. c语言条件语句示例_PHP中的条件语句和示例

    c语言条件语句示例 PHP条件语句 (PHP Conditional Statements) While coding, you may get to a point where your resul ...

  5. Spring Setter依赖注入示例

    学习如何编写Spring Setter依赖注入示例 . Setter注入是Spring依赖注入的一种 . Spring支持字段注入,Setter注入以及构造函数注入,以将依赖项注入Spring托管的b ...

  6. Spring字段依赖注入示例

    学习如何编写Spring Field Injection示例 . 字段注入是Spring框架 依赖注入的一种 . 在本教程中,我们将编写几个类,并看一看现场注入工程. 有关Spring依赖注入的更多信 ...

  7. Spring构造函数依赖注入示例

    欢迎使用Spring构造函数依赖注入示例指南. 基于构造器的依赖注入是Spring 依赖注入的一种 . 依赖注入的另一种类型是Setter注入和字段注入. 有关Spring依赖注入的更多信息: Spr ...

  8. Spring MVC3 Hibernate CRUD示例应用程序

    学习从HelloWorld应用程序开始的任何Web框架都是一个好主意. 一旦我们熟悉了框架配置,最好做一个CRUD(创建,读取,更新,删除)应用程序,该应用程序涵盖Web框架的各个方面,例如验证,请求 ...

  9. Spring MVC拦截器示例

    我以为是时候看看Spring的MVC拦截器机制了,这种机制已经存在了很多年,并且是一个非常有用的工具. Spring Interceptor会按照提示进行操作:在传入的HTTP请求到达您的Spring ...

最新文章

  1. PTA---指针错误汇总(就自己做个笔记)
  2. 面试题目集锦--二叉树
  3. android accessibility 模拟键盘事件_H5 键盘兼容性小结
  4. 第17件事 成功要素分析
  5. 树莓派作为客户端与WemosD1作为服务器的无线通信(局域网通信)
  6. Android学习(七)—— Android布局
  7. c语言第一章考试题及答案,C语言考试题库及答案整理版.doc
  8. Network Embedding 与 Graph Embedding
  9. 宁波大学计算机应用技术考研,宁波大学2021年计算机考研拟录取数据分析
  10. 关于JSON的那些事儿
  11. sas table将缺失值计入百分比_SAS系列28:SAS宏语言(一)
  12. win7系统怎么用计算机,win7电脑配置怎么查看_win7系统查看电脑配置的方法
  13. python架构师是做什么的_架构师的工作都干些什么?!想做架构师必看!
  14. 解决Matlab2016无法访问笔记本自带摄像头问题
  15. 如何在虚拟机下安装一个Linux操作系统?(简简单单30步,安装Linux详细教程)
  16. ***测试技巧总结更新篇2
  17. C语言编程中void什么意思,程序设计中遇到的void到底是什么意思
  18. php 微信红包瓜分,PHP实现微信红包金额拆分试玩的算法示例
  19. Python轻松实现动态网页爬虫(附详细源码)!
  20. redis设置后台启动,关闭后台redis

热门文章

  1. wireshark数据分析-Bravo-1
  2. 蓝桥杯 给定n个十六进制正整数,输出它们对应的八进制数。
  3. html文本框不显示滚动条,html怎么设置不显示滚动条
  4. android应用的屏幕适配,移动APP测试:Android屏幕适配问题一
  5. python loadlibrary_Python ctypes cdll.LoadLibrary,实例化一个对象,执...
  6. 台州学院ACM:1748: Dungeon Master
  7. 软件测试培训学习哪些内容?
  8. 亿格名片 | 亿格云牵手“共享充电宝行业龙头公司“怪兽充电
  9. 思科(Cisco)日志分析工具
  10. 在chrome网页上通过点击链接或执行js打开本地文件夹