在Spring Boot
项目中,我们只需要引入spring-boot-start-web
就能使用web
开发相关的功能,而不需要添加任何配置。其实Spring Boot
帮我们做好了很多的自动配置,在应用启动的时候依托于@EnableAutoConfiguration
注解来激活自动配置的模块。本文中的@Enable
和@Conditional
我并没有细说,这两部分内容在我之前的文章中有详细的阐述。如果读者并不这两部分内容熟悉的话,请先读我的另外的两篇文章。之前的文章中探究了@Enable***
用来激活指定的配置模块和使用@Conditional
实现条件配置,在这个基础上再来看这个这个自动配置就非常简单了,我们一起去看一看。
演示环境
- IntelliJ IDEA 2018.2.1 (Community Edition)
- Maven 3.5.4
- Spring Boot 2.1.1.RELEASE
走进源码
这里我们就以Web
模块为例,来说明一下这个自动装配的怎么实现的。正常情况下我们的启动类上都会标注@SpringBootApplication
,在这个@SpringBootApplication
注解里面我们会发现@EnableAutoConfiguration
用来激活我们的自动配置模块。
@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 {
}
而这个@EnableAutoConfiguration
注解里面使用了***ImportSelector
,用来实现对自动配置类的筛选。
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
}
而这个AutoConfigurationImportSelector
这个类,又借助了工厂加载机制,根据@EnableAutoConfiguration
注解的全类名去加载META-INF/spring.factories
文件中配置好的自动配置的模块。
public class AutoConfigurationImportSelector
implements DeferredImportSelector, BeanClassLoaderAware, ResourceLoaderAware,
BeanFactoryAware, EnvironmentAware, Ordered {
@Override
public String[] selectImports(AnnotationMetadata annotationMetadata) {
if (!