zoukankan      html  css  js  c++  java
  • springboot注解之@ConditionalOnProperty

      最近在研究springboot的源码,看到很多@ConditionalOnXxx的注解,大概明白此注解的意思,就是判断条件,这个条件就是Xxx,例如ConditionalOnProperty就是判断配置文件中有没有这个Property,如果有这个Property则此注解标注的类中的所有带有@Bean注解的方法就会生效,于是就会往容器中添加组件。

      虽然明白了大致意思,但是对这钟注解中的属性不是很了解,于是开始在网上找资料,最终终于弄明白了。下边将以ConditionalOnProperty注解为例来记录自己所了解到的内容。

    下边这段代码是springboot中DataSourceConfiguration类中的一段自动配置代码。其主要意思是springboot自动帮我们配置HikariDataSource数据源

    @Configuration(
            proxyBeanMethods = false
        )
        @ConditionalOnClass({HikariDataSource.class})
        @ConditionalOnMissingBean({DataSource.class})
        @ConditionalOnProperty(
            name = {"spring.datasource.type"},
            havingValue = "com.zaxxer.hikari.HikariDataSource",
            matchIfMissing = true
        )
        static class Hikari {
            Hikari() {
            }
    
            @Bean
            @ConfigurationProperties(
                prefix = "spring.datasource.hikari"
            )
            HikariDataSource dataSource(DataSourceProperties properties) {
                HikariDataSource dataSource = (HikariDataSource)DataSourceConfiguration.createDataSource(properties, HikariDataSource.class);
                if (StringUtils.hasText(properties.getName())) {
                    dataSource.setPoolName(properties.getName());
                }
    
                return dataSource;
            }
        }

    这段源码中,就存在ConditionalOnProperty注解,其中有三个属性name、havingValue、matchIfMissing

      name:这个属性是指从application.properties/yml配置文件中读取的属性名称

      havingValue:将name属性绑定的从配置读取的属性值跟havingValue绑定的值进行比较,如果一样则返回true;否则返回false。返回true,则当前配置类生效,返回flase则当前配置类不生效。

      matchIfMissing:这个属性我查了好多博客,很多都说的很含糊。这个属性如果设置为true就代表:如果在配置文件中找不到name指定的属性(即没有配置name所指定的属性,在这里就是上边代码的spring.datasource.type),则直接返回true,当前配置类生效。

    总而言之,上边springboot源码中的ConditionalOnProperty注解:

        @ConditionalOnProperty(
            name = {"spring.datasource.type"},
            havingValue = "com.zaxxer.hikari.HikariDataSource",
            matchIfMissing = true
        )

    ConditionalOnProperty注解会先判断配置文件中有没有spring.datasource.type这个属性,如果没有,则当前配置类直接生效,@Bean注解就会往ioc容器中添加HikariDataSource类型的数据源。如果配置文件中有配置spring.datasource.type这个属性,则将spring.datasource.type对应的值与"com.zaxxer.hikari.HikariDataSource"进行比较,比较结果一致,则当前配置类生效,@Bean注解往ioc容器中添加HikariDataSource类型的数据源。比较结果不一致,则返回flase,当前配置类不生效,不生效就什么都不做,不会往容器中添加组件。

  • 相关阅读:
    自定义上传图片拼图游戏
    react 移动端 兼容性问题和一些小细节
    利用AudioContext来实现网易云音乐的鲸鱼音效
    解决跨域问题,实例调用百度地图
    SVG vs Image, SVG vs Iconfont
    保存登陆username和password
    Android学习之——优化篇(2)
    ubuntu下新建用户
    PHP Laravel 本地化语言支持
    apache 绿色版 安装
  • 原文地址:https://www.cnblogs.com/bear7/p/13684920.html
Copyright © 2011-2022 走看看