Spring Boot 教程

SpringApplication 类

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() 方式获取。

设置延迟初始化和自定义 Banner

演示在调用 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("+--------------------------------------------+");
    }

}
说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号