建立好一個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中