//SpringBootApplication.java /** * 表示一個聲明一個或多個的{@link Configuration configuration}類 * {@link Bean @Bean}方法並觸發{@link EnableAutoConfiguration *自動配置}和{@link ComponentScan組件掃描}。這很方便 *等同於聲明{@code @Configuration}的註釋, * {@code @EnableAutoConfiguration}和{@code @ComponentScan}。 * * @author Phillip Webb * @author Stephane Nicoll * @since 1.2.0 */ @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 { /** *排除特定的自動配置類,使其永遠不會應用。 * @return the classes to exclude */ @AliasFor(annotation = EnableAutoConfiguration.class) Class<?>[] exclude() default {}; /** * 排除特定的自動配置類名稱,使它們永遠不會 *適用。 * @return the class names to exclude * @since 1.3.0 */ @AliasFor(annotation = EnableAutoConfiguration.class) String[] excludeName() default {}; /** *基本軟件包以掃描帶註釋的組件。使用{@link #scanBasePackageClasses} *用於基於字符串的軟件包名稱的類型安全替代。 * @return base packages to scan * @since 1.3.0 */ @AliasFor(annotation = ComponentScan.class, attribute = "basePackages") String[] scanBasePackages() default {}; /** * {@link #scanBasePackages}的類型安全替代品,用於指定要 *掃描帶註釋的組件。指定類別的包裝將被掃描。 * <p> *考慮在每一個程序包中建立一個特殊的無操做標記類或接口 *除了被該屬性引用之外,沒有其餘用途。 * @return base packages to scan * @since 1.3.0 */ @AliasFor(annotation = ComponentScan.class, attribute = "basePackageClasses") Class<?>[] scanBasePackageClasses() default {}; }
若是使用自動配置功能就必須引用這個註解。java
//SpringBootConfiguration /** * 表示一個類提供了Spring Boot應用程序 * {@link配置@Configuration}。能夠用做彈簧的替代品 *標準{@code @Configuration}批註,以即可以找到配置 *自動(例如在測試中)。 * <p> * 應用程序僅應包含<em> one </ em> {@code @SpringBootConfiguration}和 *大多數慣用的Spring Boot應用程序將從其繼承它 * {@code @SpringBootApplication}. * * @author Phillip Webb * @since 1.4.0 */ @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Configuration public @interface SpringBootConfiguration { }
該註解 ,掃描指定路徑下的 Component(@Componment
、@Configuration
、@Service
等等)。spring
//EnableAutoConfiguration.java /** * 啓用Spring Application Context的自動配置,嘗試猜想和 *配置您可能須要的bean。自動配置類一般是 *根據您的類路徑和定義的bean來應用。例如,若是您 *您的類路徑上可能有{@code tomcat-embedded.jar} * {@link TomcatServletWebServerFactory}(除非您已定義了本身的 * {@link ServletWebServerFactory} bean)。 * <p> *使用{@link SpringBootApplication}時,上下文的自動配置爲 *自動啓用並添加此註釋所以沒有其餘效果。 * <p> * 自動配置會嘗試儘量智能化,而且會像您同樣落後 *定義更多您本身的配置。您隨時能夠手動{@link #exclude()} *您永遠不想應用的配置(若是不使用,請使用{@link #excludeName()} *能夠訪問它們)。您也能夠經過 * {@code spring.autoconfigure.exclude}屬性。始終應用自動配置 *在註冊用戶定義的bean以後。 * <p> * 用{@code @EnableAutoConfiguration}註釋的類的程序包, *一般經過{@code @SpringBootApplication}進行,具備特定的意義而且常常使用 *做爲「默認值」。例如,在掃描{@code @Entity}類時將使用它。 *一般建議您放置{@code @EnableAutoConfiguration}(若是您 *不要在根包中使用{@code @SpringBootApplication}),以便全部子包 *和類別能夠搜索。 * <p> *自動配置類是常規的Spring {@link Configuration} bean。他們是 *使用{@link SpringFactoriesLoader}機制定位(針對此類)。 *一般,自動配置Bean是{@link條件@Conditional} Bean(大多數 *常常使用{@link ConditionalOnClass @ConditionalOnClass}和 * {@link ConditionalOnMissingBean @ConditionalOnMissingBean}註釋)。 * * @author Phillip Webb * @author Stephane Nicoll * @since 1.0.0 * @see ConditionalOnBean * @see ConditionalOnMissingBean * @see ConditionalOnClass * @see AutoConfigureAfter * @see SpringBootApplication */ @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @AutoConfigurationPackage @Import(AutoConfigurationImportSelector.class) public @interface EnableAutoConfiguration { String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration"; /** * 排除特定的自動配置類,使其永遠不會應用。 * @return the classes to exclude */ Class<?>[] exclude() default {}; /** *排除特定的自動配置類名稱,使它們永遠不會 *適用。 * @return the class names to exclude * @since 1.3.0 */ String[] excludeName() default {}; }
/** * 若是有此註解將會註冊到spring ioc容器中 * {@link AutoConfigurationPackages}. * * @author Phillip Webb * @since 1.3.0 * @see AutoConfigurationPackages */ @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @Import(AutoConfigurationPackages.Registrar.class) public @interface AutoConfigurationPackage { }
實現 DeferredImportSelector、BeanClassLoaderAware、ResourceLoaderAware、BeanFactoryAware、EnvironmentAware、Ordered 接口,處理 @EnableAutoConfiguration
註解的資源導入。tomcat
// AutoConfigurationImportSelector.java /** * 返回應考慮的自動配置類名稱。默認 *此方法將使用{@link SpringFactoriesLoader}與 * {@link #getSpringFactoriesLoaderFactoryClass()}. * @param metadata the source metadata * @param attributes the {@link #getAttributes(AnnotationMetadata) annotation * attributes} * @return a list of candidate configurations */ protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) { // <1> 加載指定類型 EnableAutoConfiguration 對應的,在 `META-INF/spring.factories` 裏的類名集合 List<String> configurations = SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(), getBeanClassLoader()); Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories. If you " + "are using a custom packaging, make sure that file is correct."); return configurations; }
這裏能夠結合源碼debug試試就知道了,加載的都是以下的配置安全