美文网首页
springboot之消失的配置文件

springboot之消失的配置文件

作者: fanbuer | 来源:发表于2019-03-16 17:41 被阅读0次

列位看官大家好,但凡是使用过springboot的小伙伴,一定有一种好奇,那些个烦人的配置文件到底去哪里了,怎么说消失就消失了呢,说走就走还让我有点不踏实呢,那么这些烦人的家伙真的了无牵挂的走了吗,今天让我们来一探究竟!
要搞明白这个问题我们从一个注解开始...

/**
 *
 * @SpringBootApplication 来标注一个主程序类,说明这是一个Spring Boot应用
 */
@SpringBootApplication
public class BaseApplication {
    public static void main(String[] args) {
        SpringApplication.run(BaseApplication.class,args);
    }
}

@SpringBootApplication:一个组合注解

@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 {

该注解标注在某个类上说明这个类是SpringBoot的主配置类,SpringBoot 就应该运行这个类的main方法来启动SpringBoot应用
跟我们本次探讨的话题有关的主要是@SpringBootConfiguration和@EnableAutoConfiguration这个两个注解


image.png

@SpringBootConfiguration

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
public @interface SpringBootConfiguration {
}

该类上加了一个@Configuration,在spring中,类上加该注解表示该类为配置类,所以,被@SpringBootConfiguration标注的则为Spring Boot的配置类,配置类就相当于配置文件
再说@EnableAutoConfiguration

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {
    String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";

    Class<?>[] exclude() default {};

    String[] excludeName() default {};
}

这里我们主要关注@AutoConfigurationPackage(自动配置包)和@Import(EnableAutoConfigurationImportSelector.class) (指定导入组件)
@AutoConfigurationPackage(自动配置包)

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Import({Registrar.class})
public @interface AutoConfigurationPackage {
}

@Import(AutoConfigurationPackages.Registrar.class)

static class Registrar implements ImportBeanDefinitionRegistrar, DeterminableImports {
        Registrar() {
        }

        public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {
            AutoConfigurationPackages.register(registry, (new AutoConfigurationPackages.PackageImport(metadata)).getPackageName());
        }

registerBeanDefinitions()调用register()将主配置类(@SpringBootApplication标注的类)的所在包及下面所有子包里面的所有组件扫描到Spring容器
@Import(EnableAutoConfigurationImportSelector.class) (指定导入组件)

public class AutoConfigurationImportSelector implements DeferredImportSelector, BeanClassLoaderAware, ResourceLoaderAware, BeanFactoryAware, EnvironmentAware, Ordered {
    

该类中的selectImports()调用getCandidateConfigurations()调用SpringFactoriesLoader.loadFactoryNames(EnableAutoConfiguration.class,classLoader);

protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
        List<String> configurations = SpringFactoriesLoader.loadFactoryNames(this.getSpringFactoriesLoaderFactoryClass(), this.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;
    }

该方法将会给容器中导入这个场景所需要的所有组件,并配置好这些组件,添加到spring容器中,以便使用
比如我们使用消息队列,该方法就给我们导入RabbitAutoConfiguration
总结
Spring Boot在启动的时候从类路径下的META-INF/spring.factories中获取EnableAutoConfiguration指定的值,将这些值作为自动配置类导入到容器中,自动配置类就生效,帮我们进行自动配置工作
类有点多,有点绕,大家主要吧这张图记住就可以啦

image.png

相关文章

网友评论

      本文标题:springboot之消失的配置文件

      本文链接:https://www.haomeiwen.com/subject/ofysmqtx.html