文章参考来源
以下原理我就从启动类启动的时候开始说起,也是自己学习的一个切入点吧!
首先启动类上有个注解@SpringbootApplication
,这个注解是一个复合注解或派生注解,包含三个注解:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = {
@Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM,
classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
@SpringbootConfiguration
允许在上下文中注册额外的bean或导入其他配置类@EnableAutoConfiguration
启动Springboot的自动配置机制@ComponentScan
扫描被@Component @Service @Controller
注解的bean,注解默认会扫描该类所在的包下所有的类
其中@EnableAutoConfiguration
开启自动配置,就是配置这块的核心注解,打开这个注解源码如下:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
这个注解也是一个派生注解,他的关键核心功能就是由注解@Importer
提供的,这个注解导入了AutoConfigurationImportSelector.class
这个类,点进去看看这个类的源码,
有个方法selectImports(~)
,
@Override
public String[] selectImports(AnnotationMetadata annotationMetadata) {
if (!isEnabled(annotationMetadata)) {
return NO_IMPORTS;
}
AutoConfigurationMetadata autoConfigurationMetadata = AutoConfigurationMetadataLoader
.loadMetadata(this.beanClassLoader);
AutoConfigurationEntry autoConfigurationEntry = getAutoConfigurationEntry(
autoConfigurationMetadata, annotationMetadata);
return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());
}
这个方法里面会找到项目中所有包下拥有META-INF/spring.factories的jar包。
他的调用路径我就写个大概,其实我也只知道调用路径(下面我简单写一下),并不知道每句代码具体什么意思,关键我觉得我没必要去了解详细的源码,能知道大概的实现自动化配置的流程就好了,不同意的勿喷,可以去看更详细的源码!
selectImports(~)
--getAutoConfigurationEntry
--AutoConfigurationImportSelector.getCandidateConfigurations
--SpringFactoriesLoader.loadFactoryNames
--loadSpringFactories
比如这里就说下spring-boot-autoconfigure-x.x.x.x.jar
里就有一个这样的spring.factories
文件。
单看这个文件的话,可以看到我们平时比较熟悉的,比如redis、jdbc、aop等等,全在这里。
而且这个文件是以key-value形式存在的,比如我们自动配置这块,key就是org.springframework.boot.autoconfigure.EnableAutoConfiguration
,value就是很多很多个xxxxxAutoConfiguration
的类名的列表,这些类都是逗号分隔的。
# Initializers
org.springframework.context.ApplicationContextInitializer=\
org.springframework.boot.autoconfigure.SharedMetadataReaderFactoryContextInitializer,\
org.springframework.boot.autoconfigure.logging.ConditionEvaluationReportLoggingListener
# Application Listeners
org.springframework.context.ApplicationListener=\
org.springframework.boot.autoconfigure.BackgroundPreinitializer
# Auto Configuration Import Listeners
org.springframework.boot.autoconfigure.AutoConfigurationImportListener=\
org.springframework.boot.autoconfigure.condition.ConditionEvaluationReportAutoConfigurationImportListener
# Auto Configuration Import Filters
org.springframework.boot.autoconfigure.AutoConfigurationImportFilter=\
org.springframework.boot.autoconfigure.condition.OnBeanCondition,\
org.springframework.boot.autoconfigure.condition.OnClassCondition,\
org.springframework.boot.autoconfigure.condition.OnWebApplicationCondition
# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\
org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\
org.springframework.boot.autoconfigure.batch