最近在研究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,当前配置类不生效,不生效就什么都不做,不会往容器中添加组件。

springboot注解之@ConditionalOnProperty的更多相关文章

  1. springboot注解使用说明

    springboot注解 @RestController和@RequestMapping注解 我们的Example类上使用的第一个注解是 @RestController .这被称为一个构造型(ster ...

  2. springBoot系列-->springBoot注解大全

    一.注解(annotations)列表 @SpringBootApplication:包含了@ComponentScan.@Configuration和@EnableAutoConfiguration ...

  3. SpringBoot注解大全(转)

    原文链接:[springBoot系列]--springBoot注解大全 一.注解(annotations)列表 @SpringBootApplication:包含了@ComponentScan.@Co ...

  4. springboot注解大全

    springboot注解:@Service: 注解在类上,表示这是一个业务层bean@Controller:注解在类上,表示这是一个控制层bean@Repository: 注解在类上,表示这是一个数据 ...

  5. SpringBoot注解验证参数

    SpringBoot注解验证参数 废话不多说,直接上表格说明: 注解 作用类型 解释 @NotNull 任何类型 属性不能为null @NotEmpty 集合 集合不能为null,且size大于0 @ ...

  6. SpringBoot注解把配置文件自动映射到属性和实体类实战

    SpringBoot注解把配置文件自动映射到属性和实体类实战 简介:讲解使用@value注解配置文件自动映射到属性和实体类 1.配置文件加载 方式一 1.Controller上面配置 @Propert ...

  7. 转-spring-boot 注解配置mybatis+druid(新手上路)-http://blog.csdn.net/sinat_36203615/article/details/53759935

    spring-boot 注解配置mybatis+druid(新手上路) 转载 2016年12月20日 10:17:17 标签: sprinb-boot / mybatis / druid 10475 ...

  8. 【转载】springboot注解

    https://blog.csdn.net/yitian_66/article/details/80866571 springboot注解:@Service: 注解在类上,表示这是一个业务层bean@ ...

  9. SPRINGBOOT注解最全详解(

    #     SPRINGBOOT注解最全详解(整合超详细版本)          使用注解的优势:               1.采用纯java代码,不在需要配置繁杂的xml文件           ...

随机推荐

  1. Windows核心编程笔记之作业

    创建作业,并加以限制 HANDLE WINAPI CreateJob() { BOOL IsInJob = FALSE; DWORD ErrorCode = NULL; // 不能将已经在作业中的进程 ...

  2. XCTF-wtf.sh-150

    wtf.sh-150 题目描述 没有描述 解题过程 打开之后是个论坛,有注册和登录功能点 抓包发现,登陆成功后会设置cookie <script>document.cookie = 'US ...

  3. 使用TK框架中updateByPrimaryKey与updateByPrimaryKeySelective区别

    int updateByPrimaryKey(T var1); int updateByPrimaryKeySelective(T var1); updateByPrimaryKeySelective ...

  4. Redis数据结构—整数集合与压缩列表

    目录 Redis数据结构-整数集合与压缩列表 整数集合的实现 整数集合的升级 整数集合不支持降级 压缩列表的构成 压缩列表节点的构成 小结 Redis数据结构-整数集合与压缩列表 大家好,我是白泽.今 ...

  5. redis的数据结构、使用场景、持久化方式以及常见面试问题

    一.redis中的数据结构 1.字符串(String) SET key value //存入字符串键值对 MSET key value[key value...] //批量存储字符串键值对 SETNX ...

  6. Java方法区的理解

    方法区逻辑上是属于堆的一部分,但一些简单的实现可能不会选择去进行垃圾收集或者进行压缩. 但对于HotSpotJVM而言,方法区还有一个别名叫做Non-Heap,目的就是要和堆分开 所以方法区看作是一块 ...

  7. Java集合详解(五):Hashtable原理解析

    概述 本文是基于jdk8_271版本进行分析的. Hashtable与HashMap一样,是一个存储key-value的双列集合.底层是基于数组+链表实现的,没有红黑树结构.Hashtable默认初始 ...

  8. 消息队列之 RabbitMQ【验证通过】

    消息队列之 RabbitMQ 预流 关注  22.9 2017.05.06 16:03* 字数 4884 阅读 284691评论 41喜欢 618赞赏 2 关于消息队列,从前年开始断断续续看了些资料, ...

  9. Nginx——Docker下安装部署

    前言 Nginx 是一个高性能的 HTTP 和反向代理 web 服务器,同时也提供了 IMAP/POP3/SMTP 服务 . 一. 环境说明 docker: 18.09.9-ce nginx: 1.1 ...

  10. Linux进阶之Git分布式版本控制系统篇

    一.Git介绍 Git(读音为/gɪt/.)是一个开源的分布式版本控制系统,可以有效.高速的处理从很小到非常大的项目版本管理. Git 是 Linus Torvalds 为了帮助管理 Linux 内核 ...