# SpringBoot-K2 **Repository Path**: weekends/spring-boot-k2 ## Basic Information - **Project Name**: SpringBoot-K2 - **Description**: SpringBoot 自动装配 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2023-05-17 - **Last Updated**: 2023-05-17 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ### 自动装配 #### 流程 * `@SpringBootApplication`注解主要引入`@SpringBootConfiguration`、`@EnableAutoConfiguration`、`@ComponentScan`三个注解 * `@EnableAutoConfiguration`注解主要引入`@Import(AutoConfigurationImportSelector.class)`注解 * `AutoConfigurationImportSelector`类继承`ImportSelector`类,其`selectImports`方法返回类全路径会自动注入容器中 ![img.png](img.png) #### 核心代码 ``` java protected AutoConfigurationEntry getAutoConfigurationEntry(AnnotationMetadata annotationMetadata) { // 未开启注解,返回空 if (!isEnabled(annotationMetadata)) { return EMPTY_ENTRY; } // 获取EnableAutoConfiguration中的参数,exclude()/excludeName() AnnotationAttributes attributes = getAttributes(annotationMetadata); // 获取候选的所有配置信息,通过SPI获取META-INF/spring.factories里声明的配置类 List configurations = getCandidateConfigurations(annotationMetadata, attributes); // 移除重名的配置类,List转Set再转List configurations = removeDuplicates(configurations); // 获取排除项,也就是EnableAutoConfiguration的exclude/excludeName属性 Set exclusions = getExclusions(annotationMetadata, attributes); // 检查需要排除的类是否在configurations中,不在报错 checkExcludedClasses(configurations, exclusions); // 移除排除的配置类 configurations.removeAll(exclusions); // 过滤配置类,根据META-INF/spring-autoconfigure-metadata.properties文件下配置条件进行过滤 configurations = getConfigurationClassFilter().filter(configurations); // 监听器 import 事件回调 fireAutoConfigurationImportEvents(configurations, exclusions); // 返回数据 return new AutoConfigurationEntry(configurations, exclusions); } ``` #### 相关文件 * `META-INF/spring.factories`:自动装配所有候选类配置 * `META-INF/spring-autoconfigure-metadata.properties`:候选类是否自动装配过滤条件配置 * `META-INF/additional-spring-configuration-metadata.json`:`application.yml`提示信息 #### 关联项目 `SpringBoot-K2-Start`:根据条件自动装配自定义`ApplicationContext`配置类,手写`Start`