- 本文介绍Spring Boot核心配置
@SpringBootApplication
。 - 基于Spring Boot 2.7.0版本。
- 官网文档:https://docs.spring.io/spring-boot/docs/2.7.0/reference/html/using.html#using.using-the-springbootapplication-annotation
介绍
@SpringBootApplication
注解,会激活3个注解:
@Configuration
@EnableAutoConfiguration
@ComponentScan annotations
本文的主要内容导图:
@SpringBootApplication
注解-1:@Configuration
Spring Boot @SpringBootApplication
主要的注解:
@SpringBootApplication
的自身定义,可以看到它上面的注解,其中一个为:@SpringBootConfiguration
:
@SpringBootConfiguration
的定义,可以看到它的其中一个注解即为@Configuration
:
注解-2:@EnableAutoConfiguration
@SpringBootApplication
的自身定义,可以看到除了上述介绍的@SpringBootConfiguration
外,还有@EnableAutoConfiguration
:
配置类:AutoConfigurationImportSelector
从注解的名字可以看出,它激动了auto-configuration的相关配置。
@EnableAutoConfiguration
自身的定义,看到import了一个重要的类,叫AutoConfigurationImportSelector
:
AutoConfigurationImportSelector
类中,有内部类,其中一个内部类为:AutoConfigurationGroup
:
这个内部static类实现了接口DeferredImportSelector
的内部接口:Group
:
这个接口有两个方法:
- void process(AnnotationMetadata metadata, DeferredImportSelector selector);
- Iterable<Entry> selectImports();
所以我们回到内部static类DeferredImportSelector
,重点看上述两个方法,先看process方法:
process方法内 --> getAutoConfigurationEntry(annotationMetadata)
:
2.1 通过SpringFactoriesLoader
加载META-INF/spring.factories
在getAutoConfigurationEntry(annotationMetadata)
中,
--> 调用了:getCandidateConfigurations(annotationMetadata, attributes)
--> SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(), getBeanClassLoader())
,
这里有个重要的类,即【SpringFactoriesLoader
】,在这个类中,主要加载了包中的文件:META-INF/spring.factories
:
Enumeration<URL> urls = classLoader.getResources("META-INF/spring.factories");
这里的META-INF/spring.factories
并不是指特定某个jar包中的,而是会扫描所有依赖包中的,比如我自定义了一个starter,我就可以在自己的starter的resources下定义该文件:
文件内容,只需要指定我们的autoconfig类:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.test.autoconfigure.UserAutoConfiguration
我们在另一个项目中引入这个自定义的starter,然后debug上述的getAutoConfigurationEntry
方法:
2.2 通过AutoConfigurationMetadataLoader
加载META-INF/spring-autoconfigure-metadata.properties
上述的getAutoConfigurationEntry(annotationMetadata)
方法中,除了#2.1的内容外,再看方法中另一个调用:【getConfigurationClassFilter()
】:
通过getConfigurationClassFilter()
--> new ConfigurationClassFilter(this.beanClassLoader, filters)
--> AutoConfigurationMetadataLoader.loadMetadata(classLoader)
,
最终到了【AutoConfigurationMetadataLoader
】类:
从META-INF中,读取了文件:spring-autoconfigure-metadata.properties
。
当前包是哪个呢?
即配置类AutoConfigurationMetadataLoader
所在的包,即spring-boot-autoconfigure-2.7.0.jar
。
当前包是哪个呢?
本章配置类AutoConfigurationMetadataLoader
所在的包,即spring-boot-autoconfigure-2.7.0.jar
。
注解-3:@ComponentScan
image.png在@SpringBootApplication
的定义中,除了配置1、2外,第3个配置就比较熟悉了。从Spring 3.1开始就有的一个注解,即自动包扫描功能,会自动扫描包路径下面的所有被@Controller、@Service、@Repository、@Component 注解标识的类,然后装配到Spring容器中。
可以看到在@SpringBootApplication
中,会把上述配置2,自动加载进来的class给排除掉:
@ComponentScan
默认的包路径为@SpringBootApplication
注解修饰的类所在的package。
网友评论