@Conditional OnMissingBenと@Condational OnBenの使い方

20322 ワード

@Conditional OnMissingBenと@Condational OnBen
    :                 bean,   @Bean  
@ConditionalOnMissingBean  :        Spring    bean          ,      ,     
@ConditionalOnBean  :         bean      spring  ,        ,     

ソース:
@Conditional OnMissingBenと@Condational OnBen
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Conditional({OnBeanCondition.class})
public @interface ConditionalOnBean {
    Class<?>[] value() default {};

    String[] type() default {};

    Class<? extends Annotation>[] annotation() default {};

    String[] name() default {};

    SearchStrategy search() default SearchStrategy.ALL;// bean       bean         

    Class<?>[] parameterizedContainer() default {};
}

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Conditional({OnBeanCondition.class})
public @interface ConditionalOnMissingBean {
    Class<?>[] value() default {};

    String[] type() default {};

    Class<?>[] ignored() default {};

    String[] ignoredType() default {};

    Class<? extends Annotation>[] annotation() default {};

    String[] name() default {};

    SearchStrategy search() default SearchStrategy.ALL;

    Class<?>[] parameterizedContainer() default {};
}

    @ConditionalOnMissingBean @ConditionalOnBean                OnBeanCondition,      @Conditional
@Conditionalは具体的に@Comptional注釈を見に行きます.使用とユーザー定義の検証とこの文章を注釈します.
OnBenCodition:
@Order(2147483647)
class OnBeanCondition extends FilteringSpringBootCondition implements ConfigurationCondition {
	...         
}

OnBeanCondition      matches  ,     FilteringSpringBootCondition   SpringBootCondition   matches  。
デモ:
  • インターフェースAnimal
    public interface Animal {
        String eat();
    }
    
  • を作成します.
  • は、2つの実装クラス
    public class Dog implements Animal {
        @Override
        public String eat() {
            return " ";
        }
    }
    
    public class Cat implements Animal {
        @Override
        public String eat() {
            return "  ";
        }
    }
    
  • をそれぞれ作成する.
  • は、2つの構成クラス
    @Configuration
    public class CatConfig {
        @Bean
        public Animal animal() {
            return new Cat();
        }
    }
    
    @Configuration
    public class DogConfig {
        @Bean
        public Animal animal() {
            return new Cat();
        }
    }
    
  • を作成する.
  • 試験類
    @SpringBootApplication
    public class ServiceDiscoverApplication implements CommandLineRunner {
    
        @Autowired
        private Animal animal;
    
        public static void main(String[] args) {
            SpringApplication.run(ServiceDiscoverApplication.class, args);
        }
    
    	//    
        @Override
        public void run(String... args) throws Exception {
            String eat = animal.eat();
            System.out.println(eat);
        }
    }
    
  • テスト
  • @Conditional OnMissingBenは配置類を修正し、CatConfigに@Conditional OnMissingBenを追加します.
    @Configuration
    public class CatConfig {
        @Bean
        @ConditionalOnMissingBean
        public Animal animal() {
            return new Cat();
        }
    }' '   DogConfig   @ConditionalOnMissingBean'  '
        
             Animal   bean,        @ConditionalOnMissingBean   Animal  bean spring ioc  。
    
  • @Condtional OnBenはCat類を修正して、@Serviceを削除して、spring管理
    public class Cat implements Animal {
        @Override
        public String eat() {
            return "  ";
        }
    }
    
    にCatConfig類を変更させないで、CatConfigに@Condational OnBen注解を追加します.
    @Configuration
    public class CatConfig {
        @Bean
        @ConditionalOnBean(Cat.class)
        public Animal animal() {
            return new Cat();
        }
    }' '   DogConfig   @ConditionalOnBean(Dog.class)@Service'  '
        
    
     bean Animal       spring   ,         @ConditionalOnBean   bean spring ioc  。
    
  • .