SpringBoot中条件注解@condition的使用

SpringBoot基础注入@Condition使用

I. @Conditional注解

这个注解在Spring4中引入,其主要作用就是判断条件是否满足,从而决定是否初始化并向容器注册Bean,自定义实现一个bean时只需要实现Condition接口中的matches方法即可。

public class RandBooleanCondition implements Condition {

 @Override 

public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) { String type = conditionContext.getEnvironment().getProperty("conditional.rand.type"); return "boolean".equalsIgnoreCase(type); } }

使用时用 

@Conditional(value= {RandBooleanCondition.class})

如果一个Bean是通过自动扫描加载的,是否可以直接在Bean的类上添加注解来决定是否载入呢?

@Component

@Conditional(ScanDemoCondition.class)

public class ScanDemoBean {

    @Value("${conditional.demo.load}")

    private boolean load;

    public boolean getLoad() {

        return load;

    }

}

对应的判断条件如下,当配置文件中conditional.demo.load为true时,才会加载这个配置,否则不实例化

public class ScanDemoCondition implements Condition {

    @Override

    public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {

        return "true".equalsIgnoreCase(conditionContext.getEnvironment().getProperty("conditional.demo.load"));

    }

}

通过@Conditional注解配合Condition接口,来决定给一个bean是否创建和注册到Spring容器中,从而实现有选择的加载bean.

优势

这样做的目的是什么呢?

  • 当有多个同名bean时,怎么抉择的问题
  • 解决某些bean的创建有其他依赖条件的case

更多注解

上面可以控制bean的创建,但通过上面的流程,会发现有一点繁琐,有没有什么方式可以简化上面的流程呢?

只用一个注解就好,不要自己再来实现Condtion接口,Spring框架提供了一系列相关的注解,如下表

@ConditionalOnSingleCandidate

当给定类型的bean存在并且指定为Primary的给定类型存在时,返回true

@ConditionalOnMissingBean

当给定的类型、类名、注解、昵称在beanFactory中不存在时返回true.各类型间是or的关系

@ConditionalOnBean

与上面相反,要求bean存在

@ConditionalOnMissingClass

当给定的类名在类路径上不存在时返回true,各类型间是and的关系

@ConditionalOnClass

与上面相反,要求类存在

@ConditionalOnExpression

spel表达式执行为true

@ConditionalOnProperty

要求配置属性匹配条件

@ConditionalOnResource

要求制定的资源存在

用例如下:当WindowsCondition.class的条件匹配时才加载bill对象到容器中。

@Conditional(value= {WindowsCondition.class})

        @Bean("bill")

        public Person getPerson01() {

                return new Person("bill gate", 64);

        }

@ConditionalOnExpression("'${business.filters}'.contains('text')")

当有多个bean时根据配置选择加载那些bean,当配置文件中business.filters中包含text时加载以上该bean,business.filters=text,image

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot,@Conditional注解和@AutoConfigureAfter注解是非常常用的注解,下面我来给你详细解析一下这两个注解。 ## @Conditional注解 @Conditional注解Spring Boot非常重要的一个注解,在Spring Boot,很多自动配置都是通过@Conditional注解来实现的。 @Conditional注解可以根据满足某些条件来决定是否创建一个bean。比如,我们可以根据某个类是否存在来决定是否创建一个bean,具体示例如下: ```java @Configuration @Conditional(ExistClassCondition.class) public class MyConfiguration { @Bean public MyBean myBean() { return new MyBean(); } } public class ExistClassCondition implements Condition { @Override public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { try { Class.forName("com.example.MyClass"); return true; } catch (ClassNotFoundException e) { return false; } } } ``` 上面的代码,我们定义了一个MyConfiguration类,并且在该类上加了@Conditional注解,该注解的参数是一个Condition的实现类ExistClassCondition。ExistClassCondition的matches方法返回true的条件是com.example.MyClass类存在。 这样,当com.example.MyClass类存在的时候,MyBean这个bean才会被创建。否则,MyBean这个bean不会被创建。 ## @AutoConfigureAfter注解 @AutoConfigureAfter注解也是Spring Boot比较常用的注解之一,它可以用来控制自动配置的顺序。 比如,我们可以通过@AutoConfigureAfter注解来控制某个自动配置类在另一个自动配置类之后加载,具体示例如下: ```java @Configuration @AutoConfigureAfter(MyAutoConfiguration.class) public class MyAnotherAutoConfiguration { // ... } ``` 上面的代码,我们定义了一个MyAnotherAutoConfiguration类,并且在该类上加了@AutoConfigureAfter注解,该注解的参数是MyAutoConfiguration.class。这样,在Spring Boot启动时,MyAutoConfiguration这个自动配置类会先于MyAnotherAutoConfiguration这个自动配置类被加载。 总结:@Conditional注解和@AutoConfigureAfter注解都是Spring Boot非常实用的注解。通过@Conditional注解可以实现根据满足某些条件来决定是否创建一个bean,通过@AutoConfigureAfter注解可以控制自动配置类的加载顺序,这些都是我们在实际开发非常常用的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值