条件装配

@Conditional 此注解是用来判断是否满足指定条件来决定是否进行Bean实例化及装配。

@Conditional 派生条件加载配置注解

  1. @ConditionalOnBean
  2. @ConditionalOnMissingBean
  3. @ConditionalOnClass
  4. @ConditionalOnMissingClass
  5. @ConditionalOnProperty

    @ConditionalOnBean

    当给定的在bean存在时,则实例化当前Bean

  1. @Bean
  2. public People people(City city) {
  3. //这里如果city实体没有成功注入 这里就会报空指针
  4. city.setCityName("千岛湖");
  5. city.setCityCode(301701);
  6. return new People("小小", 3, city);
  7. }

@ConditionalOnBean注解定义

  1. @Target({ ElementType.TYPE, ElementType.METHOD })
  2. @Retention(RetentionPolicy.RUNTIME)
  3. @Documented
  4. @Conditional(OnBeanCondition.class)
  5. public @interface ConditionalOnBean {
  6. /**
  7. * 需要作为条件的类的Class对象数组
  8. */
  9. Class<?>[] value() default {};
  10. /**
  11. * 需要作为条件的类的Name,Class.getName()
  12. */
  13. String[] type() default {};
  14. /**
  15. * (用指定注解修饰的bean)条件所需的注解类
  16. */
  17. Class<? extends Annotation>[] annotation() default {};
  18. /**
  19. * spring容器中bean的名字
  20. */
  21. String[] name() default {};
  22. /**
  23. * 搜索容器层级,当前容器,父容器
  24. */
  25. SearchStrategy search() default SearchStrategy.ALL;
  26. /**
  27. * 可能在其泛型参数中包含指定bean类型的其他类
  28. */
  29. Class<?>[] parameterizedContainer() default {};
  30. }

@ConditionalOnMissingBean

它作用在@bean定义上,就是在容器加载它作用的bean时, 检查容器中是否存在目标类型(@ConditionalOnMissingBean注解的value值)的bean了, 如果存在这跳过原始bean的默认加载动作 简易:当给定的在bean不存在时,则实例化当前Bean

@ConditionalOnClass

当给定的类名在类路径上存在,则实例化当前Bean

@ConditionalOnMissingClass

当给定的类名在类路径上不存在,则实例化当前Bean

@ConditionalOnProperty

给点对应配置文件的参数符合时,对应的配置才会生效。

  1. @Retention(RetentionPolicy.RUNTIME)
  2. @Target({ ElementType.TYPE, ElementType.METHOD })
  3. @Documented
  4. @Conditional(OnPropertyCondition.class)
  5. public @interface ConditionalOnProperty {
  6. // 数组,获取对应property名称的值,与name不可同时使用
  7. String[] value() default {};
  8. // 配置属性名称的前缀,比如spring.http.encoding
  9. String prefix() default "";
  10. // 数组,配置属性完整名称或部分名称
  11. // 可与prefix组合使用,组成完整的配置属性名称,与value不可同时使用
  12. String[] name() default {};
  13. // 可与name组合使用,比较获取到的属性值与havingValue给定的值是否相同,相同才加载配置
  14. String havingValue() default "";
  15. // 缺少该配置属性时是否可以加载。如果为true,没有该配置属性时也会正常加载;反之则不会生效
  16. boolean matchIfMissing() default false;
  17. }

装配-先后顺序

@AutoConfigure After | Before | Order

After :在配置类加载之后加载

Before:在配置类加载之前加载 Order:指定在配置类加载顺序

  1. @Configuration
  2. public class co nfigureConfigTest{
  3. }
  4. @Configuration
  5. //在此配置类加载之后 加载configureConfigTest
  6. @AutoConfigureAfter(configureConfigTest.class)
  7. //在此配置类加载之前 加载
  8. @AutoConfigureBefre(configureConfigTest.class)
  9. public class configureConfig{
  10. }

20201126114613853.png