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中

相关文章
相关标签/搜索