美文网首页
Spring Boot的自动装配

Spring Boot的自动装配

作者: _52Hertz | 来源:发表于2020-03-01 13:31 被阅读0次

    Spring Boot的自动装配的结构图:

    结构图

    入口点:SpringBoot的引导类有如下内容:

    @SpringBootApplication
    public class TestApplication {
        public static void main(String[] args) {
          SpringApplication.run(TestApplication.class,args);
       }
    }
    

    @SpringBootApplication注解:

    @SpringBootApplication是一个组合注解,主要是以下三个注解:
    @SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan

    查看源码:

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

    @SpringBootConfiguration注解:

    查看源码:

    @Target({ElementType.TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Configuration
    public @interface SpringBootConfiguration {
        @AliasFor(
            annotation = Configuration.class
        )
        boolean proxyBeanMethods() default true;
    }
    

    看源码发现有一个@Configuration注解,这个注解是用来标识某一个类为Spring的
    一个配置类,@SpringBootConfiguration注解和@Configuration注解的作用是一样的,但是Spring Boot更推荐@SpringBootConfiguration注解。

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

    @EnableAutoConfifiguration注解也是组合注解,主要包含@AutoConfigurationPackage和
    @Import。

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

    该注解通过@Import引入了一个Registrar.class类,Registrar类主要是加载@SpringBootApplication注解所
    在类的包结构,并进行存储,为后期Spring Boot加载资源提供一个扫描的包路径。

    @Import(AutoConfigurationImportSelector.class)

    上述@Import注解引入了一个类AutoConfigurationImportSelector.class,读取该类的源代码会发现,SpringBoot启动所在的装配类都在该注解类所在项目的META-INF/spring.factories文件中读取

    image.png

    Spring Boot在启动的时候从类路径下的META-INF/spring.factories中获取EnableAutoConfiguration指定的值,将这些值作为自动配置类导入到容器中,自动配置类就生效,帮我们进行自动配置工作。以前我们需要自己配置的东西,自动配置类都帮我们完成了。

    image.png
    image.png

    相关文章

      网友评论

          本文标题:Spring Boot的自动装配

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