SpringBoot 常用条件注解的使用

5 篇文章 0 订阅
5 篇文章 0 订阅

在这里插入图片描述

条件注解

顾名思义根据自定义的条件,来告诉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容器当中,反之则不加入
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值