美文网首页程序员
SpringBoot的工作机制

SpringBoot的工作机制

作者: SofiyaJ | 来源:发表于2018-01-19 19:15 被阅读0次

    理念:约定优先配置

    简洁的Spring IoC(Inversion Of Control)

    IoC.png

    经常遇到的“context.getBean(..);”的代码做的就是DL的工作,之后的DI工作就是讲之前获取到的Bean按照约定的逻辑联系起来,即一共2个阶段:
    1.搜集和注册
    2.分析和组装

    SpringBoot应用的启动类:

    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    @SpringBootApplication
    public class Application {
        public static void main(String[] args) {
            SpringApplication.run(Application.class);
        }
    }
    

    拥有“三体”结构的@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 {
                                    ···
    }
    

    1.@Configuration

    JavaConfig形式的IoC容器配置类,可以将上诉启动类拆分成两个独立的Java类

    @Configuration
    @EnableAutoConfiguration
    @ComponentScan
    public class DemoConfiguration{
        @Bean
        public Controller controller(){
            return new Controller();
        }
    }
    public class DemoApplication {
        public static void main(String[] args) {
            SpringApplication.run(DemoApplication.class,args);
        }
    }
    

    2.@EnableAutoConfiguration

    借助@Import将JVM相关的bean定义加载到IoC容器,其实是一个复合的Annotation,其定义的关键信息如下:

    @SuppressWarnings("deprecation")
    @Target(ElementType.TYPE)
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Inherited
    @AutoConfigurationPackage
    @Import(EnableAutoConfigurationImportSelector.class)
    public @interface EnableAutoConfiguration {
                                  ...
    }
    

    其中, @Import(EnableAutoConfigurationImportSelector.class)将所有符合条件的@Configuration配置都加载到当前创建的IoC容器中,其中,“智能”配置的关键是SpringFactoriesLoader类。其核心作用机理是从classpath中搜寻所有的META-INF/spring.factories配置文件,通过反射的方式实例化有@Configuration标注的JavaConfig形式的IoC容器配置类,然后汇总到IoC容器中。

    3.@ComponentScan

    这个是可有可无的,作用是批量自动扫描。

    SpringBoot程序启动的流程:

    SpringBoot.png

    再谈自动配置

    基于条件的自动配置

    @Configuration / @Bean + @Conditional
    

    最终实现的效果类似如下伪代码:
    if(符合@Conditional规定的条件){
    加载当前配置(enable current Configuration)或者注册当前Bean定义;
    }
    所谓基于条件的配置,就是通过@Conditional指定自己的Conditional实现类就可以了:

    @Conditional({MyCondition1.class,MyCondition2.class,...})
    

    所谓的“智能”自动配置,是@Conditional可以作为一个Meta Annotation用来标注其它的Annotation实现类,从而构建复合的Annotation,然后再结合@EnableAutoConfiguration就可以实现自动配置了。
    SpringBoot的autoconfiguration模块就是基于这一优良的传统。

    调整自动配置的顺序

    @AutoConfigureBefore
    @AutoConfigureAfter
    

    使用上面的2个标签可以让当前配置或者组件按照我们期望的顺序进行。

    程序媛小白一枚,如有错误,烦请批评指正!(#.#)

    相关文章

      网友评论

        本文标题:SpringBoot的工作机制

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