SpringApplication.run(*.class, args) 中 *.class 参数的用途

N. *_*ikh 5 java spring spring-boot

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

在查看了源代码之后,我并不清楚为什么需要这样做。

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);
    }

}
Run Code Online (Sandbox Code Playgroud)

Pat*_*mil 1

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


1.进入方法:

一个静态帮助器,可用于使用默认设置从指定源运行 SpringApplication,其中primarySource 是要加载的主要源,args 应用程序参数(通常从 Java 主方法传递),这会导致运行 ApplicationContext

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

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

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


2. Spring应用程序初始化

运行 Spring 应用程序,创建并刷新一个新的 ApplicationContext,其中参数 args 是返回正在运行的 ApplicationContext 的应用程序参数(通常从 Java 主方法传递)

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 Code Online (Sandbox Code Playgroud)

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

prepareContext(context, environment, listeners, applicationArguments, printedBanner);
Run Code Online (Sandbox Code Playgroud)

您可能想在这里探索更多细节 启动流程源码分析