美文网首页程序员
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