SpringBoot的依赖管理以及自动配置原理
本篇对springBoot的依赖管理以及自动配置等两个特性进行介绍,尤其对自动配置的原理进行了详细的解释和源码分析,通过redis的案例对配置加载过程进行说明。
依赖管理
-
父项目做依赖管理(自动版本仲裁)。即spring-boot-starter-parent提供相关的 Maven 默认依赖,使用它之后,常用包的依赖就可以省去 version 标签。
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.4.3</version> <relativePath/> <!-- lookup parent from repository --> </parent>
//列举定义的版本号 <activemq.version>5.16.1</activemq.version> <antlr2.version>2.7.7</antlr2.version> <appengine-sdk.version>1.9.86</appengine-sdk.version> <artemis.version>2.15.0</artemis.version> <aspectj.version>1.9.6</aspectj.version> <assertj.version>3.18.1</assertj.version> <atomikos.version>4.0.6</atomikos.version> <awaitility.version>4.0.3</awaitility.version> <bitronix.version>2.1.4</bitronix.version> <build-helper-maven-plugin.version>3.2.0</build-helper-maven-plugin.version> <byte-buddy.version>1.10.20</byte-buddy.version> <caffeine.version>2.8.8</caffeine.version>
-
修改默认的版本号。根据就近原则,在pom中修改之后,先按照pom中的版本号,否则遵循父类中的版本。
<properties> <mysql.version>5.1.43</mysql.version> </properties>
自动配置
-
启动类上都标有**@SpringBootApplication**这个注解,此注解包含以下三种注解:
@SpringBootConfiguration //等同于@Configuration @EnableAutoConfiguration @ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class), @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) }) 默认扫描与启动类同包下的类,若想改变扫描路径,@SpringBootApplication(scanBasePackages="com.example")或者@ComponentScan 指定扫描路径。
-
然后看看@EnableAutoConfiguration干了什么
@AutoConfigurationPackage//当SpringBoot应用启动时默认会将启动类所在的package作为自动配置的package。 @Import(AutoConfigurationImportSelector.class) public @interface EnableAutoConfiguration { } /* 即此注解导入了一个AutoConfigurationImportSelector.class类。该类会加载META-INF/spring.factories下EnableAutoConfiguration类型的所有values。 SpringFactoriesLoader读取META-INF/spring.factories文件,加载相应类型的类 */ protected AutoConfigurationEntry getAutoConfigurationEntry(AnnotationMetadata annotationMetadata) { if (!isEnabled(annotationMetadata)) { return EMPTY_ENTRY; } AnnotationAttributes attributes = getAttributes(annotationMetadata); List<