美文网首页
Spring boot执行流程图-SpringApplicati

Spring boot执行流程图-SpringApplicati

作者: engineer_tang | 来源:发表于2020-10-03 18:05 被阅读0次

Spring boot框架简化了我们开发企业级JAVA应用,这是一个以自动配置为中心的架构设计,从创建项目到发布项目使用它之后,可以极大地降低了操作难度和节约了大量时间成本,下面就从Spring boot源码基础上来认识Spring boot。

1. 初始化前的准备

创建一个SpringApplication实例,将来自指定主源的bean加载到应用程序上下文。
这个阶段做的操作包括:

  1. 确认启动类型,这里是Servlet
  2. 设置ApplicationContextInitializer
  3. 设置监听器listeners
  4. 推导主应用程序类
    @SuppressWarnings({ "unchecked", "rawtypes" })
    public SpringApplication(ResourceLoader resourceLoader, Class<?>... primarySources) {
        this.resourceLoader = resourceLoader;
        Assert.notNull(primarySources, "PrimarySources must not be null");
        this.primarySources = new LinkedHashSet<>(Arrays.asList(primarySources));
        this.webApplicationType = WebApplicationType.deduceFromClasspath();
        setInitializers((Collection) getSpringFactoriesInstances(ApplicationContextInitializer.class));
        setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class));
        this.mainApplicationClass = deduceMainApplicationClass();
    }

2. 初始化

    public ConfigurableApplicationContext run(String... args) {
        StopWatch stopWatch = new StopWatch();
        stopWatch.start();
        ConfigurableApplicationContext context = null;
        Collection<SpringBootExceptionReporter> exceptionReporters = new ArrayList<>();
        configureHeadlessProperty();
        SpringApplicationRunListeners listeners = getRunListeners(args);
        listeners.starting();
        try {
            ApplicationArguments applicationArguments = new DefaultApplicationArguments(args);
            ConfigurableEnvironment environment = prepareEnvironment(listeners, applicationArguments);
            configureIgnoreBeanInfo(environment);
            Banner printedBanner = printBanner(environment);
            context = createApplicationContext();
            exceptionReporters = getSpringFactoriesInstances(SpringBootExceptionReporter.class,
                    new Class[] { ConfigurableApplicationContext.class }, context);
            prepareContext(context, environment, listeners, applicationArguments, printedBanner);
            refreshContext(context);
            afterRefresh(context, applicationArguments);
            stopWatch.stop();
            if (this.logStartupInfo) {
                new StartupInfoLogger(this.mainApplicationClass).logStarted(getApplicationLog(), stopWatch);
            }
            listeners.started(context);
            callRunners(context, applicationArguments);
        }
        catch (Throwable ex) {
            handleRunFailure(context, ex, exceptionReporters, listeners);
            throw new IllegalStateException(ex);
        }

        try {
            listeners.running(context);
        }
        catch (Throwable ex) {
            handleRunFailure(context, ex, exceptionReporters, null);
            throw new IllegalStateException(ex);
        }
        return context;
    }

AnnotationConfigServletWebServerApplicationContext的父类GenericApplicationContext创建beanFactory实例

    public GenericApplicationContext() {
        this.beanFactory = new DefaultListableBeanFactory();
    }

2.1 prepareContext方法

该阶段的操作如下

  1. 设置environment
  2. 设置转换服务ApplicationConversionService
  3. 使用ApplicationContextInitializer对context进行初始化
  4. context被创建并准备好, SpringApplicationRunListener监听。
  5. 设置BeanFactory的allowBeanDefinitionOverriding参数,默认为false.
  6. 将bean加载到应用程序上下文中。

2.2 refreshContext方法

刷新ApplicationContext底层,刷新步骤如下:

  1. 准备刷新此上下文
    a. 为刷新准备此上下文,设置其启动日期和活动标志,以及执行属性源的任何初始化。
  2. 告诉子类刷新内部bean工厂
    a. 调用obtainFreshBeanFactory方法,其中包括refreshBeanFactory方法、getBeanFactory方法,refreshBeanFactory方法是一个抽象方法,子类必须实现此方法才能执行实际的配置加载,子类要么创建一个新的bean工厂并保存对它的引用,或者返回它持有的单个BeanFactory实例。在后一种情况下,如果超过一次刷新上下文,则通常会抛出illeglastateException。
  3. 准备BeanFactory以供在此上下文中使用。
    a. 配置工厂的标准上下文特征,例如上下文中的ClassLoader和post-processors。
  4. 允许在上下文子类中对bean工厂进行后处理。
    a. 在标准初始化后更新应用程序上下文的内部bean factory,所有的bean定义都将被加载,但是还没有bean被实例化。这允许在某些ApplicationContext实现中注册特殊的BeanPostProcessor等。
  5. 在上下文中调用注册为bean的工厂处理器。
    a. 实例化并调用所有注册的BeanFactoryPostProcessor bean,遵从明确的order值,如果给了order值的话,必须在单例实例化之前调用。
  6. 注册bean processors 用来拦截 bean的创建行为。
    a. 注册并实例化所有的BeanPostProcessor bean.
  7. 在应用上下文中初始化message source
  8. 在应用上下文中初始化event multicaster。
  9. 初始化特定上下文子类中的其他特殊bean。
  10. 检查并注册listener beans
  11. 实例化所有剩余(non-lazy-init)单例。
  12. 最后一步,发布相关的事件。

所有操作完成后,还需要重置Spring核心中的公共内省缓存,因为我们可能不再需要单例bean的元数据了。。。

2.3 afterRefresh方法

这是一个空实现的方法,可进行扩展。

相关文章

网友评论

      本文标题:Spring boot执行流程图-SpringApplicati

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