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. java中使用base64加密解密16进制方法
  2. 基于360搜图爬取图片
  3. ab flash player 8_FLASH 质子治疗的技术挑战
  4. Makefile学习(三)[第二版]
  5. Android 系统性能优化(45)---Android 多线程
  6. 中国象棋将帅问题java_编程之美读书笔记1.2——中国象棋将帅问题
  7. Spark的存储管理
  8. 备战双十一·谁的表情包在天上飞
  9. 系统学习深度学习(二) --自编码器,DA算法,SDA,稀疏自编码器
  10. 嵌入式Linux/Android疑难杂症工作笔记
  11. C++自定义sort排序
  12. SAP针对中国市场推出双轨制医疗计划
  13. 计算机外文文献ssh,计算机外文文献及翻译(SSH).doc
  14. python怎么加图片_python如何增加背景图片
  15. MAF 项目创建流程
  16. COGS 613. 火车站饭店 解题报告
  17. Http协议简单理解
  18. N! hdu 1042
  19. 微信公众号自定义菜单CLICK返回的是大写
  20. Java 八大基本数据类型简述

热门文章

  1. 云桌面用固态硬盘—IT运维的定海神针
  2. Android歌词显示控件TextView自定义
  3. 如何下载谷歌地球高程为SHP格式的等高线
  4. 案例 | 重庆银行流动数据安全挑战及应对实践
  5. 角色扮演游戏(RPG)-------之谈
  6. 详解split()使用方法
  7. Linux vi/vim文本编辑器技巧, vim多窗口使用技巧
  8. Apache Impala 4.1概览
  9. 17 | 排队也要讲效率:HTTP的连接管理
  10. Android图片的获取和存储