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


     

     

    下面来介绍如何使用@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");
            }
    }
  • 相关阅读:
    【Azure 环境】 介绍两种常规的方法来监视Window系统的CPU高时的进程信息: Performance Monitor 和 Powershell GetCounter
    云边协同架构助力智能工厂视觉 AI 缺陷检测应用构建
    桥接 Mosquitto MQTT 消息至 EMQX
    如何保障物联网平台的安全性与健壮性
    eKuiper Newsletter 202208|多平台插件一键安装,使用更便捷
    使用 Prometheus 监控 eKuiper 规则运行状态
    EMQX Operator 如何快速创建弹性伸缩的 MQTT 集群
    EMQX 5.0 全新网关框架:轻松实现多物联网协议接入
    云原生赋能智能网联汽车消息处理基础框架构建
    MQTT X Newsletter 202208 | v1.8.2 发布、支持使用 Docker
  • 原文地址:https://www.cnblogs.com/pejsidney/p/9273547.html
Copyright © 2020-2023  润新知