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("+--------------------------------------------+"); } }