目录
前言
SpringBoot
的一大好处就是:大大简化了 Spring
和其他框架的整合配置。传统的 SSM
套装虽然很大程度地简化了 Web
开发,但是其的配置文件却较为繁琐,为了简化配置文件使开发者更专注于业务编码,可以使用 SpringBoot
来进行 Web
开发,其精简的配置和庞大繁茂的生态圈绝对令人惊叹
SpringBoot
之所以可以达到如此精简的配置,主要原因就是 SpringBoot
自动配置
自动配置原理
本文的 SpringBoot
的版本为 2.0.6 RELEASE
SpringBoot
应用的启动类
SpringBoot
应用是从启动类的 main
方法中启动,加载 SpringBoot
配置类
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
@SpringBootApplication
注解
由于 SpringBoot
应用是从启动类的 main
方法中启动的,我们就有必要查看 @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 {
// 省略 ......
}
可以看到 @SpringBootApplication
这个注解是一个复合注解,它有三个核心注解,下面我们依次查看它们
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan
@SpringBootConfiguration
注解
表明它是一个配置类
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
public @interface SpringBootConfiguration {
}
@ComponentScan
注解
它负责包的扫描,并排除一些特定的类型(不允许注册进 Spring
容器)
@ComponentScan(excludeFilters = {
@Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
@EnableAutoConfiguration
注解
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
// 省略 ......
}
可以看到 @EnableAutoConfiguration
注解是个复合注解,有两个元注解,我们依次查看它们
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
@AutoConfigurationPackage
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Import(AutoConfigurationPackages.Registrar.class)
public @interface AutoConfigurationPackage {
}
查看 AutoConfigurationPackages.Registrar
static class Registrar implements ImportBeanDefinitionRegistrar, DeterminableImports {
@Override
public void registerBeanDefinitions(AnnotationMetadata metadata,BeanDefinitionRegistry registry) {
register(registry, new PackageImport(metadata).getPackageName());
}
@Override
public Set<Object> determineImports(AnnotationMetadata metadata) {
return Collections.singleton(new PackageImport(metadata));
}
}
它其实是注册了一个 bean
的定义,返回了当前主启动类包的同级以及子级的包组件
@Import(AutoConfigurationImportSelector.class)
在 AutoConfigurationImportSelector
类中查看 selectImports()
方法
@Override
public String[] selectImports(AnnotationMetadata annotationMetadata)