写点什么

从零开始学 Spring Boot 系列 -SpringApplication

作者:EquatorCoco
  • 2024-04-08
    福建
  • 本文字数:1827 字

    阅读完需:约 6 分钟

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 你可以这样写:

@SpringBootApplicationpublic 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)方法。

@Componentpublic 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

体验地址:http://www.jnpfsoft.com/?from=001

用户头像

EquatorCoco

关注

还未添加个人签名 2023-06-19 加入

还未添加个人简介

评论

发布
暂无评论
从零开始学Spring Boot系列-SpringApplication_Java_EquatorCoco_InfoQ写作社区