Spring Condition条件使用示例
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条件使用示例相关推荐
- 【Spring注解系列04】@Condition条件注解
1.@Condition条件注解 满足指定条件,则会加载对应的实例或者类.该注解可以作用于类和方法上. @Condition类属性值中,对应的类,必须是实现Condition接口的类 2.实例 配置类 ...
- Spring注解大全(示例详解)
Controller 标识一个该类是Spring MVC controller处理器,用来创建处理http请求的对象. @Controller public class TestController ...
- Spring Boot 缓存教程示例
在本Spring Boot 教程中,学习如何从 Spring 框架缓存支持中轻松管理应用程序缓存.Spring 在缓存方面有一些很好的特性,Spring 缓存 API 的抽象使用起来非常简单. 1.缓 ...
- c语言条件语句示例_PHP中的条件语句和示例
c语言条件语句示例 PHP条件语句 (PHP Conditional Statements) While coding, you may get to a point where your resul ...
- Spring Setter依赖注入示例
学习如何编写Spring Setter依赖注入示例 . Setter注入是Spring依赖注入的一种 . Spring支持字段注入,Setter注入以及构造函数注入,以将依赖项注入Spring托管的b ...
- Spring字段依赖注入示例
学习如何编写Spring Field Injection示例 . 字段注入是Spring框架 依赖注入的一种 . 在本教程中,我们将编写几个类,并看一看现场注入工程. 有关Spring依赖注入的更多信 ...
- Spring构造函数依赖注入示例
欢迎使用Spring构造函数依赖注入示例指南. 基于构造器的依赖注入是Spring 依赖注入的一种 . 依赖注入的另一种类型是Setter注入和字段注入. 有关Spring依赖注入的更多信息: Spr ...
- Spring MVC3 Hibernate CRUD示例应用程序
学习从HelloWorld应用程序开始的任何Web框架都是一个好主意. 一旦我们熟悉了框架配置,最好做一个CRUD(创建,读取,更新,删除)应用程序,该应用程序涵盖Web框架的各个方面,例如验证,请求 ...
- Spring MVC拦截器示例
我以为是时候看看Spring的MVC拦截器机制了,这种机制已经存在了很多年,并且是一个非常有用的工具. Spring Interceptor会按照提示进行操作:在传入的HTTP请求到达您的Spring ...
最新文章
- PTA---指针错误汇总(就自己做个笔记)
- 面试题目集锦--二叉树
- android accessibility 模拟键盘事件_H5 键盘兼容性小结
- 第17件事 成功要素分析
- 树莓派作为客户端与WemosD1作为服务器的无线通信(局域网通信)
- Android学习(七)—— Android布局
- c语言第一章考试题及答案,C语言考试题库及答案整理版.doc
- Network Embedding 与 Graph Embedding
- 宁波大学计算机应用技术考研,宁波大学2021年计算机考研拟录取数据分析
- 关于JSON的那些事儿
- sas table将缺失值计入百分比_SAS系列28:SAS宏语言(一)
- win7系统怎么用计算机,win7电脑配置怎么查看_win7系统查看电脑配置的方法
- python架构师是做什么的_架构师的工作都干些什么?!想做架构师必看!
- 解决Matlab2016无法访问笔记本自带摄像头问题
- 如何在虚拟机下安装一个Linux操作系统?(简简单单30步,安装Linux详细教程)
- ***测试技巧总结更新篇2
- C语言编程中void什么意思,程序设计中遇到的void到底是什么意思
- php 微信红包瓜分,PHP实现微信红包金额拆分试玩的算法示例
- Python轻松实现动态网页爬虫(附详细源码)!
- redis设置后台启动,关闭后台redis
热门文章
- wireshark数据分析-Bravo-1
- 蓝桥杯 给定n个十六进制正整数,输出它们对应的八进制数。
- html文本框不显示滚动条,html怎么设置不显示滚动条
- android应用的屏幕适配,移动APP测试:Android屏幕适配问题一
- python loadlibrary_Python ctypes cdll.LoadLibrary,实例化一个对象,执...
- 台州学院ACM:1748: Dungeon Master
- 软件测试培训学习哪些内容?
- 亿格名片 | 亿格云牵手“共享充电宝行业龙头公司“怪兽充电
- 思科(Cisco)日志分析工具
- 在chrome网页上通过点击链接或执行js打开本地文件夹