springboot SpringApplication 的十大特性

Posted MrQin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了springboot SpringApplication 的十大特性相关的知识,希望对你有一定的参考价值。

1、启动失败

如果你启动项目失败,你通过注册FailureAnalyzers 来获取错误信息和解决办法。比如你启动应用的8080端口被占用了,你将看到如下信息:

***************************
APPLICATION FAILED TO START
***************************

Description:

Embedded servlet container failed to start. Port 8080 was already in use.

Action:

Identify and stop the process thats listening on port 8080 or configure this application to listen on another port.

Spring Boot提供了大量的FailureAnalyzer 实现类,同时你也可以实现一个自己的。

你还可以通过打开debug属性或者在log日志配置org.springframework.boot.autoconfigure.logging.AutoConfigurationReportLoggingInitializer来让Exception更加容易理解。

打开debug属性可以启动命令后面加 --debug

$ java -jar myproject-0.0.1-SNAPSHOT.jar --debug

2、定制横幅

启动时候的横幅可以通过在classpath下面添加一个banner.txt,当然你也可以通过属性文件的banner.location指定文件和banner.charset指定文件编码(默认UTF-8)。也可以通过在classpath下添加banner.png、banner.gif、banner.jpg来替换横幅为图片,或者设置属性banner.image.location指定图片,图片将会转换文本形式显示出来。

 横幅内部可以通过EL表达式使用以下属性:

${application.version}   MANIFEST.MF文件中的版本号,如Implementation-Version: 1.0将会打印成1.0

${application.formatted-version} 也是打印版本号,不过版本号前面会加个v

${spring-boot.version} springboot版本

${spring-boot.formatted-version} 也是springboot版本,前面加个v

${application.title} MANIFEST.MF定义的应用名称,如Implementation-Title: MyApp将会打印MyApp

也可以通过SpringApplication.setBanner(…?)方式来设置横幅,实现org.springframework.boot.Banner接口的printBanner()方法来生成你的横幅。

可以通过设置spring.main.banner-mode属性来设置横幅展示与否(log,off)。

3、定制SpringApplication

如果官方自带的SpringApplication 不合你的口味,你可以自定义一个,比如,关闭Banner你可以这样写:

public static void main(String[] args) {
    SpringApplication app = new SpringApplication(MySpringConfiguration.class);
    app.setBannerMode(Banner.Mode.OFF);
    app.run(args);
}

构造函数传给SpringApplication 的参数是SpringBeans的项目配置,多数情况下可以参考@Configuration类或者被扫描的xml。

同时,也可以通过属性文件来配置这些,后面会做介绍。

 4、Fluent Builder API

你如果需要建立一个多层ApplicationContext(多个父子关系的Context),可以使用Fluent Builder API, 用类SpringApplicationBuilder实现。例如:

new SpringApplicationBuilder()
        .sources(Parent.class)
        .child(Application.class)
        .bannerMode(Banner.Mode.OFF)
        .run(args);

更多请了解SpringApplicationBuilder的API文档:https://docs.spring.io/spring-boot/docs/1.5.7.RELEASE/api/org/springframework/boot/builder/SpringApplicationBuilder.html

5、应用事件与监听器

除了SpringFramework常用的事件ContextRefreshedEvent外,SpringApplication也添加了很多事件。

很多事件在SpringApplication创建之前就被触发了,所以你不能以Bean的形式对这些事件注册监听器。

你可以通过SpringApplication.addListeners(…?)或SpringApplicationBuilder.listeners(…?)方法来注册他们。

如果你想让你的监听器能自动创建且不受SpringApplication的创建影响,你可以在项目中添加META-INF/spring.factories文件并设置org.springframework.context.ApplicationListener的值为监听器的类,如下:

org.springframework.context.ApplicationListener=com.example.project.MyListener

以下为常见事件:

ApplicationStartingEvent在应用启动之后、listeners 和initializers注册之前触发。

ApplicationEnvironmentPreparedEvent在Context启动前准备使用Environment之前触发。

ApplicationPreparedEvent在刷新后、定义的Bean被加载前。

ApplicationReadyEvent在刷新后所有的回调函数执行已经执行完、应用已经准备好相应请求。

ApplicationFailedEvent在启动时应用抛出异常触发。

 6、Web环境变量

SpringApplication会试图建立一个正确的ApplicationContext来维护你的利益。默认情况下,会根据你是否在开发环境下启动来启动AnnotationConfigApplicationContext还是AnnotationConfigEmbeddedWebApplicationContext。

判断环境变量的方法是相当简单的(通过少数类来判断),你可以通过setWebEnvironment(boolean webEnvironment)来直接设置。

7、参数

如果你要给SpringApplication.run(…?)传入参数,你可以注入org.springframework.boot.ApplicationArguments对象,ApplicationArguments提供了访问String[]参数的入口,如下:

import org.springframework.boot.*
import org.springframework.beans.factory.annotation.*
import org.springframework.stereotype.*

@Component
public class MyBean {

    @Autowired
    public MyBean(ApplicationArguments args) {
        boolean debug = args.containsOption("debug");
        List<String> files = args.getNonOptionArgs();
        // if run with "--debug logfile.txt" debug=true, files=["logfile.txt"]
    }

}

你也可以注册CommandLinePropertySource,通过@Value注解来注入参数。

8、ApplicationRunner 或 CommandLineRunner

如果你需要在SpringApplication启动后执行一些代码,你可以实现ApplicationRunner 或 CommandLineRunner。这两个方法会在SpringApplication的run方法执行完后执行run方法。

import org.springframework.boot.*
import org.springframework.stereotype.*

@Component
public class MyBean implements CommandLineRunner {

    public void run(String... args) {
        // Do something...
    }

}

你可以通过实现org.springframework.core.Ordered接口或使用org.springframework.core.annotation.Order注解来在特定代码中调用对应的ApplicationRunner 或 CommandLineRunner的bean。

 9、SpringApplication 应用退出

每一个SpringApplication都会在JVM注册一个程序关闭的钩子来保证应用优雅关闭。所有的Spring标准生命周期函数(如DisposableBean接口、或@PreDestroy)都会被执行。

你可以通过实现org.springframework.boot.ExitCodeGenerator接口。接口将会返回 特定的状态码,当SpringApplication.exit()被调用后,将与改代码作为状态码返回。

@SpringBootApplication
public class ExitCodeApplication {

    @Bean
    public ExitCodeGenerator exitCodeGenerator() {
        return new ExitCodeGenerator() {
            @Override
            public int getExitCode() {
                return 42;
            }
        };
    }

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

}

而ExitCodeGenerator接口为退出异常调用的接口。

10、Admin

通过属性 spring.application.admin.enabled 可以打开SpringApplication的admin-related特征,这将会在MBeanServer平台暴露SpringApplicationAdminMXBean接口。你可以通过此对SpringApplication进行远程管理。

如果你想知道它在哪个端口运行,可以查询属性local.server.port的值。

 

以上是关于springboot SpringApplication 的十大特性的主要内容,如果未能解决你的问题,请参考以下文章

五Spring Application那些事儿

在IDEA上使用springcloud构建单节点的注册中心

无法自动配置会话存储库,请检查您的配置(会话存储类型为“空”)

SpringApplication理解

第一个helloworld,有点小兴奋

SpringBoot入门到精通-SpringBoot自动配置原理