SpringApplication 类可用于从 Java main 方法引导和启动 Spring 应用程序。 默认情况下,class 将执行以下步骤来引导您的应用程序:
创建一个适当的 ApplicationContext 实例(取决于您的类路径 classpath)
注册一个 CommandLinePropertySource,将命令行接收的参数导出为 Spring 属性
刷新应用程序上下文,加载所有单例 bean
出发任意的 CommandLineRunner Bean
在大多数情况下,可以直接从 main 方法中调用静态 run(Class,String []) 方法来引导和启动您的 Spring 应用程序:
@Configuration
@EnableAutoConfiguration
public class MyApplication {
// ... Bean definitions
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}对于更高级的配置,可以在调用 run() 方法之前创建和定制 SpringApplication 实例:
public static void main(String[] args) {
SpringApplication application = new SpringApplication(MyApplication.class);
// ... customize application settings here
application.run(args)
}SpringApplications 可以从各种不同的来源读取 bean。通常建议使用单个 @Configuration 类来引导您的应用程序;但是,您也可以从以下位置设置源:
由 AnnotatedBeanDefinitionReader 加载的完全限定的类名
XmlBeanDefinitionReader 加载的 XML 资源的位置,或 GroovyBeanDefinitionReader 加载的 groovy 脚本
由 ClassPathBeanDefinitionScanner 扫描的软件包的名称
配置属性也绑定到 SpringApplication。 这样就可以动态设置 SpringApplication 属性,例如其他来源("spring.main.sources" - CSV列表),用于指示 Web 环境的标志("spring.main.web-application-type = none")或标志以关闭横幅广告("spring.main.banner-mode = off")。
Spring 使用 CommandLinePropertySource 将传递的参数导出为 Spring 属性,然后获取这些属性。如下:
package com.huangx.springboot.springapplication_demo1;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.core.env.Environment;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Arrays;
@RestController
@SpringBootApplication
public class SpringapplicationDemo1Application {
@Value("${myVal}")
private String myVal;
@Value("${myVal2}")
private String myVal2;
@Autowired
private Environment environment;
public static void main(String[] args) {
System.out.println(Arrays.toString(args));
ConfigurableApplicationContext context = SpringApplication.run(SpringapplicationDemo1Application.class, args);
// 获取程序参数
String myVal = context.getEnvironment().getProperty("myVal");
System.out.println("myVal=" + myVal); // OK
System.out.println("myVal=" + System.getProperty("myVal")); // null
// 获取 -D 选项传递的参数
System.out.println("myVal2=" + System.getProperty("myVal2")); // OK
System.out.println("myVal2=" + System.getProperty("myVal2")); // OK
}
@RequestMapping("/")
public String index() {
StringBuilder builder = new StringBuilder();
builder.append("<p>myVal=" + myVal + "</p>"); // OK
builder.append("<p>myVal=" + environment.getProperty("myVal") + "</p>"); // OK
builder.append("<p>myVal=" + System.getProperty("myVal") + "</p>"); // null
builder.append("<p>myVal2=" + myVal2).append("</p>"); // OK
builder.append("<p>myVal2=" + environment.getProperty("myVal2") + "</p>"); // OK
builder.append("<p>myVal2=" + System.getProperty("myVal2") + "</p>"); // OK
return builder.toString();
}
}调用方式,如下图:

上图中,VM options 输入框使用 -D 设置 JVM 参数,我们可以通过 System.getProperty() 方法获取,也可以使用 @Value 注解或通过 org.springframework.core.env.Environment 对象进行获取。如下:
// 方式1
@Value("${myVal2}")
private String myVal2;
// 方式2
@Autowired
private Environment environment;
String myVal2 = environment.getProperty("myVal2");
// 方式3
System.getProperty("myVal2")Program arguments 输入框可以且必须使用“--key=value”的形式来声明参数,否则 Spring 将不认识。如下:
// 方式1
ConfigurableApplicationContext context = SpringApplication.run(SpringapplicationDemo1Application.class, args);
String myVal = context.getEnvironment().getProperty("myVal");
// 方式2
@Value("${myVal}")
private String myVal;但是,程序参数是不能使用 System.getProperty() 方式获取。
演示在调用 SpringApplication 的 run() 方法之前进行一些高级配置,例如:设置延迟初始化、设置自定义的 Banner。如下:
package com.huangx.springboot.springapplication_demo2;
import org.springframework.boot.Banner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class SpringapplicationDemo2Application {
public static void main(String[] args) {
SpringApplication springApplication = new SpringApplication(SpringapplicationDemo2Application.class);
// 启动延迟初始化
springApplication.setLazyInitialization(true);
// 自定义 MyBanner
springApplication.setBannerMode(Banner.Mode.CONSOLE);
springApplication.setBanner(new MyBanner());
springApplication.run(args);
}
}自定以 Banner 代码如下:
package com.huangx.springboot.springapplication_demo2;
import org.springframework.boot.Banner;
import org.springframework.core.env.Environment;
import java.io.PrintStream;
public class MyBanner implements Banner {
@Override
public void printBanner(Environment environment, Class<?> sourceClass, PrintStream out) {
out.println("+--------------------------------------------+");
out.println("| |");
out.println("| Spring Boot SpringApplication |");
out.println("| |");
out.println("+--------------------------------------------+");
}
}