「浅析」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