@ConditionalOnxxx相关注解

2019-12-06 14:11:07 浏览数 (3)

@Conditional(TestCondition.class) 这句代码可以标注在类上面,表示该类下面的所有@Bean都会启用配置,也可以标注在方法上面,只是对该方法启用配置。 spring框架还提供了很多@Condition给我们用 @ConditionalOnBean(仅仅在当前上下文中存在某个对象时,才会实例化一个Bean) @ConditionalOnClass(某个class位于类路径上,才会实例化一个Bean) @ConditionalOnExpression(当表达式为true的时候,才会实例化一个Bean) @ConditionalOnMissingBean(仅仅在当前上下文中不存在某个对象时,才会实例化一个Bean) @ConditionalOnMissingClass(某个class类路径上不存在的时候,才会实例化一个Bean) @ConditionalOnNotWebApplication(不是web应用) @ConditionalOnProperty (控制某个configuration是否生效。具体操作是通过其两个属性name以及havingValue来实现的,其中name用来从application.properties中读取某个属性值,如果该值为空,则返回false;如果值不为空,则将该值与havingValue指定的值进行比较,如果一样则返回true;否则返回false。如果返回值为false,则该configuration不生效;为true则生效) 另一种总结 @ConditionalOnClass:该注解的参数对应的类必须存在,否则不解析该注解修饰的配置类; @ConditionalOnMissingBean:该注解表示,如果存在它修饰的类的bean,则不需要再创建这个bean;可以给该注解传入参数例如@ConditionOnMissingBean(name = "example"),这个表示如果name为“example”的bean存在,这该注解修饰的代码块不执行。 condition自定义声明

代码语言:javascript复制
public class InitConditional implements Condition{
    @Override
    public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
        //判断是否已经包含了amazonTest Bean
        Boolean bol =  conditionContext.getBeanFactory().containsBean("amazonTest");
        return bol;
    }
}

使用自定义的Conditional

代码语言:javascript复制
@Component
@Conditional(InitConditional.class)
public class AmazonTest {

    @Autowired
    private AmazonProperties amazonProperties;

    public void testGet(){
        System.out.println("    testGet Associated");
        System.out.println(amazonProperties.getAssociateId());
    }
}

0 人点赞