3.自动配置原理
- @SpringBootApplication:表明这个类是springboot的主配置类,也是一个组件,springboot将会运行这个类的main方法,来启动springboot应用;
- @ComponentScan():自动扫描包,并加载其符合条件的组件到容器中
- @SpringBootConfiguration :代表当前类是springboot的一个配置类
- @Configuration :代表这是一个配置类,然后作为一个组件添加到容器中
- @Component :被标注的类将会作为一个组件,添加到容器中
- @Configuration :代表这是一个配置类,然后作为一个组件添加到容器中
- @EnableAutoConfiguration :开启自动配置功能,以前需要手动配置的,现在配置这个类,springboot会自动配置;
- @AutoConfigurationPackage:自动配置包,即自动配置包下的一系列组件
- @Import(AutoConfigurationPackages.Registrar.class) :
- AutoConfigurationPackages :自动配置包
- Registrar.class:将某个包(该注解所在的类的包,例如:com.nbg.boot.controller)下的所有组件进行批量注册
- import:就是给容器中导入一个组件(AutoConfigurationPackages.Registrar.class)
-
static class Registrar implements ImportBeanDefinitionRegistrar, DeterminableImports { /** * new PackageImports(metadata).getPackageNames():获取该注解所在的包名:com.nbg.boot.controller * @param metadata * @param registry */ public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) { register(registry, new PackageImports(metadata).getPackageNames().toArray(new String[0])); } public Set<Object> determineImports(AnnotationMetadata metadata) { return Collections.singleton(new PackageImports(metadata)); } }
- @Import(AutoConfigurationPackages.Registrar.class) :
- @Import(AutoConfigurationImportSelector.class):选择必须的组件导入容器中,因为不可能所有的组件都导入到容器中,那太庞大,臃肿;
- getAutoConfigurationEntry :获取自动配置组件列表;
- List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes):获取候选组件
-
/** * AutoConfigurationEntry :获取需要自动配置的组件列表 * getCandidateConfigurations :获取候选的组件 * 然后在根据需要进行保留,例如:aop context jdbc 等; * 程序启动就加载该文件中的组件spring-boot-autoconfigure-2.4.1.jar!\META-INF\spring.factories👉# Auto Configure */ protected AutoConfigurationEntry getAutoConfigurationEntry(AnnotationMetadata annotationMetadata) { if (!isEnabled(annotationMetadata)) { return EMPTY_ENTRY; } AnnotationAttributes attributes = getAttributes(annotationMetadata); List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes); configurations = removeDuplicates(configurations); Set<String> exclusions = getExclusions(annotationMetadata, attributes); checkExcludedClasses(configurations, exclusions); configurations.removeAll(exclusions); configurations = getConfigurationClassFilter().filter(configurations); fireAutoConfigurationImportEvents(configurations, exclusions); return new AutoConfigurationImportSelector.AutoConfigurationEntry(configurations, exclusions); }
- @AutoConfigurationPackage:自动配置包,即自动配置包下的一系列组件
- 按需开启自动配置
- 虽然我们127个场景的所有自动配置启动的时候默认全部加载。xxxxAutoConfiguration
- 按照条件装配规则(@Conditional),最终会按需配置。
-
总结:
- SpringBoot先加载所有的自动配置类 xxxxxAutoConfiguration
- 每个自动配置类按照条件进行生效,默认都会绑定配置文件指定的值。xxxxProperties里面拿。xxxProperties和配置文件进行了绑定
- 生效的配置类就会给容器中装配很多组件
- 只要容器中有这些组件,相当于这些功能就有了
- 定制化配置
- 用户直接自己@Bean替换底层的组件
- 用户去看这个组件是获取的配置文件什么值就去修改。
xxxxxAutoConfiguration ---> 组件 ---> xxxxProperties里面拿值 ----> application.properties