Spring Boot的自動配置原理

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

  • 點擊進入@AutoConfigurationPackage
@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

  •     回到 @EnableAutoConfiguration 類中 @Import(EnableAutoConfigurationImportSelector.class) 會選擇將哪些組件已全類名的方式返回的選擇器,這些返回的組件會導入到容器中
    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中

相關文章
相關標籤/搜索