码迷,mamicode.com
首页 > 移动开发 > 详细

springboot SpringApplication 的十大特性

时间:2017-09-16 11:50:49      阅读:298      评论:0      收藏:0      [点我收藏+]

标签:log   setw   new   XML   debug   gem   initial   lin   err   

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 的十大特性

标签:log   setw   new   XML   debug   gem   initial   lin   err   

原文地址:http://www.cnblogs.com/qins/p/7529182.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!