在SpringBoot的自动装配中,有很多的@Condition*注解用于我们按照不同的需求来装配Bean,这里我们示例一下如何自定义自己的Condition
其实我们可以参照已经提供的一些注解来实现即可
一、需求
配置文件中某个key对应的值有多个部分组成,之间使用英文逗号分隔(且成为各个组件),要求当配置文件中配置了某个组件的时候装配对应的Bean。
如:
hello.animals=cat,dog
当存在cat的时候,装配CatHelloService;当存在dog的时候,装配DogService,当同时存在cat,dog的时候,装配AnimalHelloService。
二、自定义Conditon注解
这个参照一下@ConditionOnProperty注解,定义如下:
package com.example.demo.selfcondition;
import org.springframework.context.annotation.Conditional;
import java.lang.annotation.*;
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Conditional(OnHavingValueCondition.class)
public @interface ConditionOnHavingValue {
/**
* 属性名
* @return
*/
String name();
/**
* 需要包含的值
* @return
*/
String[] havingValue();
}
可以看到,@Conditional(OnHavingValueCondition.class)里面指定了一个Class,这个类就是用来进行匹配的。
三、创建匹配规则类
老规矩,匹配规则的编写,建议找存在的类去参考着写,我这里参考了OnPropertyCondition(用来解析@ConditionOnProperty的)
package com.example.demo.selfcondition;
import org.springframework.boot.autoc