@SpringBootConfiguration @EnableAutoConfiguration @ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class), @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) }) public @interface SpringBootApplication { }1、@SpringBootConfiguration里面包含的是@Configuration注解,代表当前是一个配置类 2、@ComponentScan指定包扫描 3、@EnableAutoConfiguration:自动配置注解
里面包含如下两个注解:
@AutoConfigurationPackage @import(AutoConfigurationimportSelector.class) public @interface EnableAutoConfiguration {}1、@AutoConfigurationPackage:自动配置包
@import(AutoConfigurationPackages.Registrar.class) //给容器中导入一个组件 public @interface AutoConfigurationPackage {} //利用Registrar给容器中导入一系列组件 //将指定的一个包下的所有组件导入进来?MainApplication 所在包下的所有组件全部进行注册
里面包含一个@import注解,导入一个AutoConfigurationPackages.Registrar组件,打开该组件,注册了所有的组件
public abstract class AutoConfigurationPackages { static class Registrar implements importBeanDefinitionRegistrar, Determinableimports { @Override public void registerBeanDefinitions(Annotationmetadata metadata, BeanDefinitionRegistry registry) { register(registry, new Packageimports(metadata).getPackageNames().toArray(new String[0])); } } }
new Packageimports(metadata).getPackageNames().toArray(new String[0]获取主启动类所在的包名 ,然后把包名封装到数组里。
register(registry,包名):将该包下所有的组件批量注册到容器
这就是为什么主启动类所在的包及其子类的所有组件能够自动被扫描进来的原因
总结: @AutoConfigurationPackag 的作用就是将SpringBoot 主配置类所在的包 及其 下面的所有子包里面的所有组件 扫描到 Spring 容器中
2、@import(AutoConfigurationimportSelector.class):启动时导入127自动配置类,然后按需加载导入AutoConfigurationimportSelector组件,点开它
1、利用getAutoConfigurationEntry(annotationmetadata);给容器中批量导入一些组件
2、调用Listconfigurations = getCandidateConfigurations(annotationmetadata, attributes)获取到所有需要导入到容器中的配置类
3、利用工厂加载 Map> loadSpringFactories(@Nullable ClassLoader classLoader);得到所有的组件
4、从meta-INF/spring.factories位置来加载一个文件。
默认扫描我们当前系统里面所有meta-INF/spring.factories位置的文件
spring-boot-autoconfigure-2.3.4.RELEASE.jar包里面也有meta-INF/spring.factories
虽然130个场景的所有自动配置启动的时候默认全部加载。xxxxAutoConfiguration
按照条件装配规则(@Conditional),最终会按需配置。
SpringBoot 在启动的时候就从类路径下的 meta-INF/spring.factories 中获取EnableAutoConfiguration指定的值,并将这些值加载到自动配置类导入到容器中,自动配置类 就生效,帮助我们进行自动配置功能。 而这些自动配置类 全都在 spring-boot-autoconfigure-2.2.6.RELEASE.jar 该jar包之下。
总结:- SpringBoot先加载所有的自动配置类 xxxxxAutoConfiguration
- 每个自动配置类按照条件进行生效,默认都会绑定配置文件指定的值。xxxxProperties里面拿。xxxProperties和配置文件进行了绑定
- 生效的配置类就会给容器中装配很多组件
- 只要容器中有这些组件,相当于这些功能就有了
- 定制化配置
-
- 用户直接自己@Bean替换底层的组件
- 用户去看这个组件是获取的配置文件什么值就去修改。
xxxxxAutoConfiguration ---> 组件 ---> xxxxProperties里面拿值 ----> application.properties
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)