建立好一个spring boot项目,找到@SpringBootApplication注解java
@SpringBootApplication public class HelloBootApplication { public static void main(String[] args) { SpringApplication.run(HelloBootApplication.class , args); /** * ssss */ } }
点击进入后,会看到这个注解是个组合注解spring
@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 {
而他的核心功能即是由 @EnableAutoConfiguration 注解提供的。 ide
@EnableAutoConfiguration:开启自动配置功能,这样自动配置才会生效;spring-boot
这样咱们之前须要本身配置的东西,SpringBoot 便会帮咱们自动配置code
当咱们点击进入@EnableAutoConfiguration中blog
@SuppressWarnings("deprecation") @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @AutoConfigurationPackage @Import(EnableAutoConfigurationImportSelector.class) public @interface EnableAutoConfiguration {
注意上图的@AutoConfigurationPackage,和@Import(EnableAutoConfigurationImportSelector.class)get
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @Import(AutoConfigurationPackages.Registrar.class) public @interface AutoConfigurationPackage { }
@Import(AutoConfigurationPackages.Registrar.class) , Spring 的底层注解@import 会给容器中导入一个组件,而导入的组件则是由AutoConfigurationPackages.Registrar.class 将主配置类(@SpringBootApplication注解标注的类)所在包及下面的子包里面的全部组件扫描到Spring容器中it
public class EnableAutoConfigurationImportSelector extends AutoConfigurationImportSelector { @Override protected boolean isEnabled(AnnotationMetadata metadata) { if (getClass().equals(EnableAutoConfigurationImportSelector.class)) { return getEnvironment().getProperty( EnableAutoConfiguration.ENABLED_OVERRIDE_PROPERTY, Boolean.class, true); } return true; } }
具体的能够看 EnableAutoConfigurationImportSelector 的父类中的 getCandidateConfigurations()方法io
public class AutoConfigurationImportSelector implements DeferredImportSelector, BeanClassLoaderAware, ResourceLoaderAware, BeanFactoryAware, EnvironmentAware, Ordered { protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) { 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; } protected Class<?> getSpringFactoriesLoaderFactoryClass() { return EnableAutoConfiguration.class; }
SpringFactoriesLoader.loadFactoryNames 方法会扫描具备 META-INF/spring.factories文件的jar,class
spring.factories文件中声明了有哪些自动配置
JAVAEE的总体整合解决方案和自动配置都在spring-boot-autoconfigure.jar中