前言
最近在看SpringCloud loadbalancer的源码,发现里面用到了很多@contional
的注解,还有其很多衍生注解例如@ConditionalOnBean
、@ConditionalOnMissingBean
等注解,发现我不太熟悉,那么就来学习一下把。
@Conditional注解
@Conditional
是Spring 4
新提供的注解,它的作用是按照一定的条件进行判断,满足条件的容器进行bean注册。它作用于类和方法上,需要传入一个实现了condition
接口的class
数组
代码示例
创建一个Condition接口的实现类,判断是否为Windows系统
1 | public class OSCondition implements Condition{ |
输出结果
1 | com.example.example01.OsServiceImpl : Windows 10被创建 |
可以看到通过OSCondition
的判断决定是否向容器注入相关的OsServiceImpl类,当然还有很多的扩展@Conditional就需要自己去试一试了。
@Conditional扩展注解
- @ConditionalOnBean:仅仅在当前上下文中存在某个对象时,才会实例化一个Bean。
- @ConditionalOnClass:某个class位于类路径上,才会实例化一个Bean。
- @ConditionalOnExpression:当表达式为true的时候,才会实例化一个Bean。
- @ConditionalOnMissingBean:仅仅在当前上下文中不存在某个对象时,才会实例化一个Bean。
- @ConditionalOnMissingClass:某个class类路径上不存在的时候,才会实例化一个Bean。
- @ConditionalOnNotWebApplication:不是web应用,才会实例化一个Bean。
- @ConditionalOnWebApplication:当项目是一个Web项目时进行实例化。
- @ConditionalOnNotWebApplication:当项目不是一个Web项目时进行实例化。
- @ConditionalOnProperty:当指定的属性有指定的值时进行实例化。
- @ConditionalOnJava:当JVM版本为指定的版本范围时触发实例化。
- @ConditionalOnResource:当类路径下有指定的资源时触发实例化。
- @ConditionalOnJndi:在JNDI存在的条件下触发实例化。
- @ConditionalOnSingleCandidate:当指定的Bean在容器中只有一个,或者有多个但是指定了首选的Bean时触发实例化