「浅析」SpringBoot之场景启动器starter


基于SpringBoot 2.6.2版本

mybatis整合starter


	org.mybatis.spring.boot
	mybatis-spring-boot-starter
	2.2.1



	mysql
	mysql-connector-java
	runtime

注意:

当你引入以上依赖而不做其他任何配置,你会发现你的项目启动不了。

因为引入mybatis-spring-boot-starter间接引入了spring-boot-starter-jdbc,当引入spring-boot-starter-jdbc,我们只能配置数据库连接或者排除数据源的自动配置。

application.yml

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/timaccount?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC
    username: root
    password: root
    driver-class-name: com.mysql.jdbc.Driver
    hikari:
      idle-timeout: 60000
      maximum-pool-size: 30
      minimum-idle: 10
      connection-timeout: 10000
  application:
    name: tim-web

启动类

@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
public class WebApp {
    public static void main(String[] args) {
        SpringApplication.run(WebApp.class, args);
    }
}

接下来我们来分析SpringBoot的starter是如何运作的。

1、pom依赖

2、指定自动装配文件位置

3、根据配置文件属性进行装配

4、获取配置文件进行属性绑定

5、springboot启动时加载springFactory

启动类注解@SpringBootApplication --> @EnableAutoConfiguration --> AutoConfigurationImportSelector。

我们来看下AutoConfigurationImportSelector的selectImports方法:

protected AutoConfigurationEntry getAutoConfigurationEntry(AnnotationMetadata annotationMetadata) {
	if (!isEnabled(annotationMetadata)) {
		return EMPTY_ENTRY;
	}
	//获取@EnableAutoConfiguration标注类的元信息。
	AnnotationAttributes attributes = getAttributes(annotationMetadata);
	//读取所有 classPath 下的 spring.factories
	List configurations = getCandidateConfigurations(annotationMetadata, attributes);
	//移除重复定义的配置类( 利用set集合的不可重复性 )
	configurations = removeDuplicates(configurations);
	//获取排除类名单,排除类可通过 exclude = {A.class.B.class}属性来排除指定的配置类。
	Set exclusions = getExclusions(annotationMetadata, attributes);
	//检查被 ExcludedClasses 的类是否存在现在的 beanFacotry 中
	checkExcludedClasses(configurations, exclusions);
	configurations.removeAll(exclusions);
	configurations = getConfigurationClassFilter().filter(configurations);
	//监听器 import 事件回调
	fireAutoConfigurationImportEvents(configurations, exclusions);
	return new AutoConfigurationEntry(configurations, exclusions);
}

其中loadSpringFactories方法如下:

自定义starter