1.Spring Boot版本
本文章使用的Spring Boot版本:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.7.4</version>
</parent>
2.简单流程介绍
2.1. 方法调用栈
-SpringApplication(primarySources).run(args)
--applicationContext.refresh()
---invokeBeanFactoryPostProcessors(beanFactory)
----PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors());
-----registryProcessor.postProcessBeanDefinitionRegistry(registry);
------processConfigBeanDefinitions(registry);
-------ConfigurationClassUtils.checkConfigurationClassCandidate(beanDef, this.metadataReaderFactory)
// 找到入口类
--------configCandidates.add(new BeanDefinitionHolder(beanDef, beanName));
-------parser.parse(candidates);
--------parse(((AnnotatedBeanDefinition) bd).getMetadata(), holder.getBeanName());
---------processConfigurationClass(new ConfigurationClass(metadata, beanName), DEFAULT_EXCLUSION_FILTER);
----------doProcessConfigurationClass(configClass, sourceClass, filter);
// Process any @Import annotations
-----------getImports(sourceClass)
------------collectImports(sourceClass, imports, visited);
-------------imports.addAll(sourceClass.getAnnotationAttributes(Import.class.getName(), "value"));
-----------processImports(configClass, sourceClass, getImports(sourceClass), filter, true);
------------this.deferredImportSelectorHandler.handle(configClass, (DeferredImportSelector) selector);
-------------handler.processGroupImports();
--------------grouping.getImports()
---------------this.group.process(deferredImport.getConfigurationClass().getMetadata(),deferredImport.getImportSelector());
----------------((AutoConfigurationImportSelector)deferredImportSelector).getAutoConfigurationEntry(annotationMetadata);
-----------------this.getCandidateConfigurations(annotationMetadata, attributes);
2.2. 流程梳理
3. 详细内容
3.1. 入口类
@SpringBootApplication
public class SpringbootDemoApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootDemoApplication.class, args);
}
}
3.2. 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 {
// ...代码省略
}
元注解 就是加到注解上的注解,它的目的是解释、说明其他普通注解。
元注解有5种,分别为
@Retention:说明该注解的存活时间
@Target:说明注解的作用目标,默认值为任何元素
@Documented:表示注解内容会被Javadoc工具提取成文档,文档内容会因为注解内容的不同而不同
@Inherited:注解过的注解作用于父类后,子类会自动继承父类的注解
@Repeatable:是在Java1.8中引入的注解,被注解后的普通注解可以被重复多次作用于一个类并传入不同的参数
3.3. EnableAutoConfiguration
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {
String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";
Class<?>[] exclude() default {};
String[] excludeName() default {};
}
3.4. AutoConfigurationImportSelector
public class AutoConfigurationImportSelector implements DeferredImportSelector, BeanClassLoaderAware, ResourceLoaderAware, BeanFactoryAware, EnvironmentAware, Ordered {
// ...代码省略
protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
// 从META-INF/spring.factories文件中获取配置
List<String> configurations = new ArrayList(SpringFactoriesLoader.loadFactoryNames(this.getSpringFactoriesLoaderFactoryClass(), this.getBeanClassLoader()));
// 从META-INF/spring/*.imports文件中获取配置
ImportCandidates.load(AutoConfiguration.class, this.getBeanClassLoader()).forEach(configurations::add);
Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories nor in META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports. If you are using a custom packaging, make sure that file is correct.");
return configurations;
}
// ...代码省略
}
3.5. 相关配置文件
4. 总结
5. 更新时间
创建时间:2022/11/15