条件注解
顾名思义根据自定义的条件,来告诉Spring的IOC容器,什么时候加载哪些自定义的Bean,或者类
如果条件不满足,则不加入IOC容器(可以理解为策略模式)
Spring提供的很多成品注解
- Spring提供的一些成品的(不需要自行扩展的)条件注解
@ConditionOnClass
@ConditionOnBean
@ConditionOnWebApplication
当前项目是Web项目的条件
@ConditionOnExpression
基于SpEL表达式作为判断条件
@ConditionOnJndi
在JNDI存在时查找指定的位置
@ConditionMissingBean
当SpringIoc容器内不存在指定的Bean的条件
@ConditionMissingClass
当SpringIoc容器内不存在指定的Class的条件
@ConditionOnNotWebApplication
当前项目不是Web项目的条件
@ConditionOnProperty
指定的属性是否有指定的值
@ConditionOnResource
类路径是否有指定的值
@ConditionOnSingleCandidate
当指定Bean在IOC容器内只有一个,或者虽然有多个但时指定首选的Bean
使用@Conditional来实现自定义条件加载Bean
- 使用基础注解
@Conditionnal
是可以自定义条件的,创建条件类,并实现Condition接口,重写其方法即可
@Configuration
public class heroConfiguration{
/**
* ISkill是一个接口,Camille是一个英雄类,有一个name和age的属性
*/
@Bean
@Conditional(HearCondition.class)
public ISkill diana(){
return new Diana("Camille","18");
}
@Bean
@Conditional(HearCondition.class)
public ISkill irelia(){
return new Irelia();
}
}
public class HearCondition implements Condition{
@Override
public boolean matches(ConditionContext context){
return false;
}
}
- 此处有两个bean,当我在自定义条件里面返回flase,那么两个Bean 都不会放入IOC容器当中
- 这个
context
实际是一个接口,当中有很多方法,能获取Bean的加载信息,全局环境配置信息,类加载信息,资源读取信息
public interface ConditionContext {
BeanDefinitionRegistry getRegistry();
@Nullable
ConfigurableListableBeanFactory getBeanFactory();
Environment getEnvironment();
ResourceLoader getResourceLoader();
@Nullable
ClassLoader getClassLoader();
}
使用@ConditionalOnBean来实现自定义条件加载Bean
- 举个例子
@Configuration
public class heroConfiguration{
@Bean
@ConditionalOnBean(name="irelia")
public ISkill diana(){
return new Diana("Camille","18");
}
@Bean
public ISkill irelia(){
return new Irelia();
}
}
- 此处有两个bean,当加载名字为diana的bean的时候,首先会去看名字为irelia的bean是否存在
- 如果存在,则把名字为diana的bean加入IOC容器当中,反之则不加入