自动配置:是 Spring Boot 提供的,实现通过 jar 包的依赖,能够自动配置应用程序。例如说:我们引入 spring-boot-starter-web
之后,就自动引入了 Spring MVC 相关的 jar 包,从而自动配置 Spring MVC
自动装配:是 Spring 提供的 IoC 注入方式
如下是一个比较简单的总结:
- Spring Boot 在启动时扫描项目所依赖的 jar 包,寻找包含
spring.factories
文件的 jar 包。 - 根据
spring.factories
配置加载 AutoConfigure 类。 - 根据
@Conditional
等条件注解 的条件,进行自动配置并将 Bean 注入 Spring IoC 中。
@SpringBootApplication
一、@Inherited注解
使用此注解声明出来的自定义注解,在使用此自定义注解时,如果注解在类上面时,子类会自动继承此注解,否则的话,子类不会继承此注解
二、@SpringBootConfiguration
可以看到,它上面继承自 @Configuration
注解,所以两者功能也一致,可以将当前类内声明的一个或多个以 @Bean
注解标记的方法的实例纳入到 Srping 容器中,并且实例名就是方法名。
三、@ComponentScan
扫描指定路径下的 Component
四、@EnableAutoConfiguration
org.springframework.boot.autoconfigure.@EnableAutoConfiguration
注解,用于开启自动配置功能,是 spring-boot-autoconfigure
项目最核心的注解
org.springframework.boot.autoconfigure.@AutoConfigurationPackage
注解,主要功能自动配置包,它会获取主程序类所在的包路径,并将包路径(包括子包)下的所有组件注册到 Spring IOC 容器中
5. AutoConfigurationImportSelector
org.springframework.boot.autoconfigure.AutoConfigurationImportSelector
,实现 DeferredImportSelector、BeanClassLoaderAware、ResourceLoaderAware、BeanFactoryAware、EnvironmentAware、Ordered 接口,处理 @EnableAutoConfiguration
注解的资源导入。
5.1 getCandidateConfigurations
#getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes)
方法,获得符合条件的配置类的数组
<1>
处,调用 #getSpringFactoriesLoaderFactoryClass()
方法,获得要从 META-INF/spring.factories
加载的指定类型为 EnableAutoConfiguration 类
调用 SpringFactoriesLoader#loadFactoryNames(Class<?> factoryClass, ClassLoader classLoader)
方法,加载指定类型 EnableAutoConfiguration 对应的,在 META-INF/spring.factories
里的类名的数组
<1>
处,调用DeferredImportSelector.Group#process(AnnotationMetadata metadata, DeferredImportSelector selector)
方法,处理被@Import
注解的注解。<2>
处,调用DeferredImportSelector.Group#this.group.selectImports()
5.3 AutoConfigurationGroup
5.3.3 selectImports
#selectImports()
方法,获得要引入的配置类
5.4 getAutoConfigurationEntry
艿艿:这是一个关键方法。因为会调用到,我们会在 「5.1 getCandidateConfigurations」 的方法。
#getAutoConfigurationEntry(AutoConfigurationMetadata autoConfigurationMetadata, AnnotationMetadata annotationMetadata)
方法,获得 AutoConfigurationEntry 对象
1.去掉重复的配置类,去掉需要排除的配置类,过滤掉不符合条件的配置类
2.触发自动配置类引入完成的事件
3.创建对应的AutoConfigurationEntry对象
5.4.1 isEnabled
#isEnabled(AnnotationMetadata metadata)
方法,判断是否开启自动配置
5.4.2 getAttributes
#getAttributes(AnnotationMetadata metadata)
方法,获得注解的属性
5.4.3 getExclusions
#getExclusions(AnnotationMetadata metadata, AnnotationAttributes attributes)
方法,获得需要排除的配置类
5.4.4 checkExcludedClasses
#checkExcludedClasses(List<String> configurations, Set<String> exclusions)
方法,校验排除的配置类是否合法
5.4.5 fireAutoConfigurationImportEvents
#fireAutoConfigurationImportEvents(List<String> configurations, Set<String> exclusions)
方法,触发自动配置类引入完成的事件
6.1 Registrar
Registrar ,是 AutoConfigurationPackages 的内部类,实现 ImportBeanDefinitionRegistrar、DeterminableImports 接口,注册器,用于处理 @AutoConfigurationPackage
注解
6.2 register
#register(BeanDefinitionRegistry registry, String... packageNames)
方法,注册一个用于存储报名(package
)的 Bean 到 Spring IoC 容器中