从零开始学Spring Boot系列-SpringApplication

SpringApplication类提供了一种从main()方法启动Spring应用的便捷方式。在很多情况下, 你只需委托给 SpringApplication.run这个静态方法 :

复制代码
    @SpringBootApplication
    public class SpringbootLearningApplication {

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

    }

当应用启动时, 你应该会看到类似下面的东西:

默认情况下会显示INFO级别的日志信息, 包括一些相关的启动详情, 比如启动应用的用户等。

自定义Banner

通过在classpath下添加一个banner.txt或设置banner.location来指定相应的文件可以改变启动过程中打印的banner。如果这个文件有特殊的编码,你可以使用banner.encoding设置它(默认为UTF-8)。在banner.txt中可以使用如下的变量:

**注:**如果想以编程的方式产生一个banner,可以使用SpringBootApplication.setBanner(...)方法。使用org.springframework.boot.Banner接口,实现你自己的printBanner()方法。

自定义SpringApplication

如果默认的SpringApplication不符合你的口味,你可以创建一个本地的实例并自定义它。例如,关闭banner你可以这样写:

复制代码
@SpringBootApplication
public class SpringbootLearningApplication {

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

}

**注:**传递给SpringApplication的构造器参数是spring beans的配置源。在大多数情况下,这些将是@Configuration类的引用,但它们也可能是XML配置或要扫描包的引用。

Application事件和监听器

除了常见的Spring框架事件,比如ContextRefreshedEvent,一个SpringApplication也发送一些额外的应用事件。一些事件实际上是在ApplicationContext被创建前触发的。你可以使用多种方式注册事件监听器,最普通的是使用SpringApplication.addListeners(...)方法。在你的应用运行时,应用事件会以下面的次序发送:

  1. 在运行开始,但除了监听器注册和初始化以外的任何处理之前,会发送一个ApplicationStartedEvent。

  2. 在Environment将被用于已知的上下文,但在上下文被创建前,会发送一个ApplicationEnvironmentPreparedEvent。

  3. 在refresh开始前,但在bean定义已被加载后,会发送一个ApplicationPreparedEvent。

  4. 启动过程中如果出现异常,会发送一个ApplicationFailedEvent。

注 :你通常不需要使用应用程序事件, 但知道它们的存在会很方便(在某些场合可能会使用到)。在Spring内部, Spring Boot使用事件处理各种各样的任务。

Web环境

一个SpringApplication将尝试为你创建正确类型的ApplicationContext。在默认情况下,使用AnnotationConfigApplicationContext或AnnotationConfigEmbeddedWebApplicationContext取决于你正在开发的是否是web应用。

用于确定一个web环境的算法相当简单(基于是否存在某些类)。如果需要覆盖默认行为,你可以使用setWebEnvironment(boolean webEnvironment)。通过调用setApplicationContextClass(...),你可以完全控制ApplicationContext的类型。

注: 当JUnit测试里使用SpringApplication时,调用setWebEnvironment(false)是可取的。

命令行启动器

如果你想获取原始的命令行参数,或一旦SpringApplication启动,你需要运行一些特定的代码,你可以实现CommandLineRunner接口。在所有实现该接口的Spring beans上将调用run(String ... args)方法。

复制代码
@Component
public class MyBean implements CommandLineRunner {

    @Override
    public void run(String... args) throws Exception {
        System.out.println("启动前执行");
    }
}

如果一些CommandLineRunner beans被定义必须以特定的次序调用, 你可以额外实现org.springframework.core.Ordered接口或使用org.springframework.core.annotation.Order注解。

Application退出

每个SpringApplication在退出时为了确保ApplicationContext被优雅的关闭, 将会注册一个JVM的shutdown钩子。所有标准的Spring生命周期回调(比如, DisposableBean接口或@PreDestroy注解)都能使用。

此外, 如果beans想在应用结束时返回一个特定的退出码(exit code),可以实现org.springframework.boot.ExitCodeGenerator接口。

文章转载自: ++代码匠心++

原文链接: https://www.cnblogs.com/daimajiangxin/p/18120105

体验地址: 引迈 - JNPF快速开发平台_低代码开发平台_零代码开发平台_流程设计器_表单引擎_工作流引擎_软件架构

相关推荐
丸码11 分钟前
Java异常体系全解析
java·开发语言
v***885611 分钟前
Springboot项目:使用MockMvc测试get和post接口(含单个和多个请求参数场景)
java·spring boot·后端
q***494512 分钟前
Ubuntu介绍、与centos的区别、基于VMware安装Ubuntu Server 22.04、配置远程连接、安装jdk+Tomcat
java·ubuntu·centos
IMPYLH18 分钟前
Lua 的 require 函数
java·开发语言·笔记·后端·junit·lua
曾经的三心草19 分钟前
基于正倒排索引的Java文档搜索引擎1-实现索引模块-实现Parser类
java·开发语言·搜索引擎
爱找乐子的李寻欢39 分钟前
线上批量导出 1000 个文件触发 OOM?扒开代码看本质,我是这样根治的
后端
vx_bscxy32243 分钟前
告别毕设焦虑!Python 爬虫 + Java 系统 + 数据大屏,含详细开发文档 基于web的图书管理系统74010 (上万套实战教程,赠送源码)
java·前端·课程设计
字节拾光录1 小时前
Java工具库三足鼎立:Hutool、Apache Commons、Guava深度测评与场景化选型指南
java·apache·guava
javaの历练之路1 小时前
基于 SpringBoot+Vue2 的前后端分离博客管理系统(含 WebSocket+ECharts)
spring boot·websocket·echarts
爱学习的小可爱卢1 小时前
Java UDP编程实战:UDP数据报套接字编程DatagramPacket、DatagramSocket 、InetSocketAddress
java·udp·udp数据报