@Conditional OnMissingBenと@Condational OnBenの使い方
20322 ワード
@Conditional OnMissingBenと@Condational OnBen
@Conditional OnMissingBenと@Condational OnBen
OnBenCodition:インターフェースAnimal を作成します.は、2つの実装クラス をそれぞれ作成する.は、2つの構成クラス を作成する.試験類 テスト @Conditional OnMissingBenは配置類を修正し、CatConfigに@Conditional OnMissingBenを追加します. @Condtional OnBenはCat類を修正して、@Serviceを削除して、spring管理 .
: 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 。
デモ:public interface Animal {
String eat();
}
public class Dog implements Animal {
@Override
public String eat() {
return " ";
}
}
public class Cat implements Animal {
@Override
public String eat() {
return " ";
}
}
@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);
}
}
@Configuration
public class CatConfig {
@Bean
@ConditionalOnMissingBean
public Animal animal() {
return new Cat();
}
}
: ' ' DogConfig @ConditionalOnMissingBean , ' '
Animal bean, @ConditionalOnMissingBean Animal bean spring ioc 。
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 。