首先我們都知道springboot都是基於註解簡化配置,啓動類註解@SpringBootApplication+run方法就實現大量starter自動配置,源碼:
@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 {
}
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";
Class<?>[] exclude() default {};
String[] excludeName() default {};
}
先從spring.factories配置文件中加載自動配置類;加載的自動配置類中排出@EnableAutoConfiguration註解的exclude指定的配置類;再用AutoConfigurationImportFilter接口過濾符合@ConditionalOnClass,@ConditionalOnBean,@ConditionalOnWebApplication條件的結果;然後觸發AutoConfigurationImportEvent事件,告訴ConditionEvaluationReport評估報告器分別記錄符合條件和exclude的自動配置類;最後spring再講最後篩選的自動配置類導入IOC容器中;