【问题标题】:Purpose of *.class argument in SpringApplication.run(*.class, args)SpringApplication.run(*.class, args) 中 *.class 参数的用途
【发布时间】:2020-11-08 13:21:52
【问题描述】:

在 Sprint Boot 中,Spring 应用程序通过在 main 方法中调用 SpringApplication.run(*.class, args) 来初始化。我想知道 run 中传递的 *.class 引用的目的是什么?

查看source code 后,我并没有立即明白为什么需要这样做。

package org.java.simpleapp.simpleapp;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class SimpleApplication {

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

}

【问题讨论】:

    标签: java spring spring-boot


    【解决方案1】:

    通过启动Application类,我们可以完成Spring初始化、自动组装等一系列操作。启动过程通过两个入口:@SpringBootApplicationSpringApplication.run


    1.进入方式:

    一个静态助手,可用于从 指定源使用默认设置 which primarySource 的 要加载的主要源,args 应用程序参数(通常通过 来自 Java main 方法),这会导致运行 应用上下文

    public static ConfigurableApplicationContext run(Class<?> primarySource, String... args) {
        return run(new Class<?>[] { primarySource }, args);
    }
    

    调用静态run方法后,通过一系列的调用我们最终会进入SpringApplication类中的如下位置

    如你所见,这个方法做了两件事,初始化Spring Application类,调用内部公共的run方法。


    2。 Spring 应用初始化

    运行 Spring 应用程序,创建并刷新一个新的 ApplicationContext with-param args 应用程序参数(通常 从 Java main 方法传递)返回一个正在运行的 应用上下文

    public ConfigurableApplicationContext run(String... args) {
    
          ...
    
          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);
            }
    
          ...
    
    }
    

    run() 负责管理上下文、环境、监听器、applicationArguments、printedBanner,正如我们在

    中看到的那样
    prepareContext(context, environment, listeners, applicationArguments, printedBanner);
    

    您可能想在此处探索更多详细信息 Startup process source analysis

    【讨论】:

      猜你喜欢
      • 2016-06-11
      • 1970-01-01
      • 2014-05-09
      • 1970-01-01
      • 2014-10-21
      • 2012-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多