springBoot----@ConditionalOnxxx相关注解总结

转载:https://www.cnblogs.com/yixianyixian/p/7346894.html

  • @ConditionalOnClass:该注解的参数对应的类必须存在,否则不解析该注解修饰的配置类;
  • @ConditionalOnMissingBean:该注解表示,如果存在它修饰的类的bean,则不需要再创建这个bean;可以给该注解传入参数例如@ConditionOnMissingBean(name = "example"),这个表示如果name为“example”的bean存在,这该注解修饰的代码块不执行。

@ConditionalOnClass:该注解的参数对应的类必须存在,否则不解析该注解修饰的配置类;

 

下面来介绍如何使用@Condition

 

[html] view plain copy

 

  1. public class TestCondition implements Condition    
  2. {    
  3.     /**   
  4.      * 只有返回true,才会启用配置   
  5.      */    
  6.     public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata)    
  7.     {    
  8.         return true;    
  9.     }    
  10. }  

 

 

 

@Conditional(TestCondition.class)

这句代码可以标注在类上面,表示该类下面的所有@Bean都会启用配置,也可以标注在方法上面,只是对该方法启用配置。

 

spring框架还提供了很多@Condition给我们用,当然总结用语哪种好理解,看给位读者喽

@ConditionalOnBean(仅仅在当前上下文中存在某个对象时,才会实例化一个Bean)
@ConditionalOnClass(某个class位于类路径上,才会实例化一个Bean)
@ConditionalOnExpression(当表达式为true的时候,才会实例化一个Bean)
@ConditionalOnMissingBean(仅仅在当前上下文中不存在某个对象时,才会实例化一个Bean)
@ConditionalOnMissingClass(某个class类路径上不存在的时候,才会实例化一个Bean)
@ConditionalOnNotWebApplication(不是web应用)

后续会继续补充

另一种总结

@ConditionalOnClass:该注解的参数对应的类必须存在,否则不解析该注解修饰的配置类;
@ConditionalOnMissingBean:该注解表示,如果存在它修饰的类的bean,则不需要再创建这个bean;可以给该注解传入参数例如@ConditionOnMissingBean(name = "example"),这个表示如果name为“example”的bean存在,这该注解修饰的代码块不执行。

 

接上文

condition自定义声明

复制代码

public class InitConditional implements Condition{

    @Override
    public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
        //判断是否已经包含了amazonTest Bean
        Boolean bol =  conditionContext.getBeanFactory().containsBean("amazonTest");
        return bol;
    }
}

复制代码

使用自定义的Conditional

复制代码

@Component
@Conditional(InitConditional.class)
public class AmazonTest {

    @Autowired
    private AmazonProperties amazonProperties;

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

复制代码

WelcomeController 与 AmazonTest关联,使用ConditionOnBean(如果条件的bean存在,当前的bean才会被声明)

复制代码

@Component
@ConditionalOnBean(AmazonTest.class)
public class WelcomeController {
    private static final Logger logger = LoggerFactory.getLogger(WelcomeController.class);

    private AppProperties app;
    private GlobalProperties global;

    @Autowired
    public void setApp(AppProperties app) {
        this.app = app;
    }

    @Autowired
    public void setGlobal(GlobalProperties global) {
        this.global = global;
    }

    public void testWelcome(){
        String appProperties = app.toString();
        String globalProperties = global.toString();
        System.out.println(appProperties);
        System.out.println(globalProperties);
    }
}

复制代码

main测试文件入口

复制代码

public static void main(String[] args) {
        ConfigurableApplicationContext configurableApplicationContext =SpringApplication.run(DemoApplication.class, args);
        //bean自动注册,根据bean的名字获取Bean
        AmazonProperties amazonProperties = (AmazonProperties) configurableApplicationContext.getBean("amazonProperties");
        System.out.println(amazonProperties.getAssociateId());



        Boolean aBooleanWelcomeController = configurableApplicationContext.containsBean("welcomeController");
        if(!aBooleanWelcomeController){
            System.out.println("        welcomeController init fail");
        }else{
            WelcomeController welcomeController = (WelcomeController) configurableApplicationContext.getBean("welcomeController");
            System.out.println("        welcomeController init Success");
        }


        Boolean    aBooleanAmazonTest = configurableApplicationContext.containsBeanDefinition("amazonTest");
        if(!aBooleanAmazonTest){
            System.out.println("        amazonTest init fail");
        }else{
            AmazonTest amazonTest = (AmazonTest) configurableApplicationContext.getBean("amazonTest");
            System.out.println("        amazonTest init Success");
        }
}

复制代码

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值