//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试试就知道了,加载的都是以下的配置安全