文章目录
SpringBoot内置的各种Starter是怎样构建的? SpringBoot源码(六)
注:该源码分析对应SpringBoot版本为2.1.0.RELEASE
1 温故而知新
本篇接 外部配置属性值是如何被绑定到XxxProperties类属性上的?–SpringBoot源码(五)
温故而知新,我们来简单回顾一下上篇的内容,上一篇我们分析了SpringBoot外部配置属性值是如何被绑定到XxxProperties类属性上的相关源码,现将外部属性绑定的重要步骤总结如下:
- 首先是@EnableConfigurationProperties注解import了EnableConfigurationPropertiesImportSelector后置处理器;
- EnableConfigurationPropertiesImportSelector后置处理器又向Spring容器中注册了ConfigurationPropertiesBeanRegistrar和ConfigurationPropertiesBindingPostProcessorRegistrar这两个bean;
- 其中ConfigurationPropertiesBeanRegistrar向Spring容器中注册了XxxProperties类型的bean;ConfigurationPropertiesBindingPostProcessorRegistrar向Spring容器中注册了ConfigurationBeanFactoryMetadata和ConfigurationPropertiesBindingPostProcessor两个后置处理器;
- ConfigurationBeanFactoryMetadata后置处理器在初始化bean factory时将@Bean注解的元数据存储起来,以便在后续的外部配置属性绑定的相关逻辑中使用;
- ConfigurationPropertiesBindingPostProcessor后置处理器将外部配置属性值绑定到XxxProperties类属性的逻辑委托给ConfigurationPropertiesBinder对象,然后ConfigurationPropertiesBinder对象又最终将属性绑定的逻辑委托给Binder对象来完成。
可见,重要的是上面的第5步。
2 引言
我们都知道,SpringBoot内置了各种Starter起步依赖,我们使用非常方便,大大减轻了我们的开发工作。有了Starter起步依赖,我们不用去考虑这个项目需要什么库,这个库的groupId和artifactId是什么?更不用担心引入这个版本的库后会不会跟其他依赖有没有冲突。
举个栗子:现在我们想开发一个web项目,那么只要引入spring-boot-starter-web这个起步依赖就可以了,不用考虑要引入哪些版本的哪些依赖了。像以前我们还要考虑引入哪些依赖库,比如要引入spring-web和spring-webmvc依赖等;此外,还要考虑引入这些库的哪些版本才不会跟其他库冲突等问题。
那么我们今天暂时不分析SpringBoot自动配置的源码,由于起步依赖跟自动配置的关系是如影随形的关系,因此本篇先站在maven项目构建的角度来宏观分析下我们平时使用的SpringBoot内置的各种Starter是怎样构建的?
3 Maven传递依赖的optional标签
在分析SpringBoot内置的各种Starter构建原理前,我们先来认识下Maven的optional标签,因为这个标签起到至关重要的作用。 Maven的optional标签表示可选依赖即不可传递的意思,下面直接举个栗子来说明。
比如有A,B和C三个库,C依赖B,B依赖A。下面看下这三个库的pom.xml文件:
// A的pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<groupId>com.ymbj</groupId>
<artifactId>A</artifactId>
<version