Spring Boot Features------1. SpringApplication文档翻译(part1)

1. SpringApplication

本节将深入讨论Spring Boot的细节。在这里,您可以了解您可能希望使用和自定义的关键特性。

SpringApplication类提供了一种方便的方式来引导从main()方法启动的Spring application。在很多情况下,你可以委托给静态的SpringApplication.ru()方法,如下面的例子所示(该主方法位于Spring Boot启动类中):

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

当你的应用程序启动,你应该看到类似以下输出:
在这里插入图片描述
默认情况下,会显示信息日志消息,包括一些相关的启动细节,比如启动应用程序的用户。如果您需要除INFO之外的日志级别,您可以自定义设置日志级别。

1.1. Startup Failure

如果您的应用程序启动失败,注册的故障分析器将有机会提供专用的错误消息和修复问题的具体操作。例如,如果您在端口8080上启动一个web应用程序,并且该端口已经在使用,您应该看到类似于以下消息:

***************************
APPLICATION FAILED TO START
***************************
Description:
Embedded servlet container failed to start. Port 8080 was already in use.

Action:
Identify and stop the process that's listening on port 8080 or configure this application to listen on another port.

Spring Boot提供了许多FailureAnalyzer实现,您可以添加自己的实现类。

如果没有故障分析程序能够处理异常,您任然可以显示完整的条件报告,以便更好地理解出错的原因。为此,您需要为
org.springframework.boot.autoconfigure.logging.ConditionEvaluationReportLoggingListener启用debug属性或是启用debug级别日志。

如果没有故障分析程序能够处理异常,您仍然可以显示完整的条件报告,以便更好地理解出错的原因。为此,您需要为ConditionEvaluationReportLoggingListener启用debug属性或启用debug日志级别。

例如,如果您使用java -jar运行您的应用程序,您可以启用debug属性,如下所示:

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

1.2. Lazy Initialization

SpringApplication允许应用程序被延迟初始化。当启用延迟初始化时,bean是根据需要而不是在应用程序启动期间创建的。因此,启用延迟初始化可以减少应用程序启动所需的时间。在web应用程序中,启用延迟初始化将导致在接收到HTTP请求之前不会初始化许多与web相关的bean。

延迟初始化的一个缺点是,它会延迟应用程序问题的发现。如果错误配置的bean是延迟初始化的,那么在启动期间将不会出现故障,只有当这个Bean被初始化时才会出现问题。另外还必须注意确保JVM有足够的内存来容纳应用程序的所有bean,而不仅仅是那些在启动期间初始化的bean。由于这些原因,默认情况下不启用延迟初始化,建议在启用延迟初始化之前对JVM堆大小进行微调。

可以使用SpringApplicationBuilder的lazyInitialization方法或是SpringApplication的setLazyInitialization 方法以编程的方式启用延迟初始化,也可以使用spring.main.lazy-initialization配置属性来启用延迟初始化

spring.main.lazy-initialization=true

如果您希望禁用某些bean的延迟初始化,同时对应用程序的其余部分使用延迟初始化,那么可以使用@Lazy(false)注释显式地将它们的延迟属性设置为false。

1.3. Customizing the Banner

可以通过在类路径中添加一个banner.txt文件或设置spring.banner.location定位此类文件的位置,来更改在start up中打印的banner。如果文件的编码不是UTF-8,可以设置spring.banner.charset。除了文本文件,您还可以添加一个banner.gif、banner.jpg或banner.png图像文件到您的类路径或设置spring.banner.image位置属性。图像被转换成ASCII艺术表现形式,并打印在任何文本banner上。
在你的banner.txt文件中,你可以使用以下任何一个占位符:
在这里插入图片描述
如果希望以编程方式生成横幅,可以使用SpringApplication.setBanner(…)方法。使用org.springframework.boot.Banner接口实现您自己的printBanner()方法。

你也可以使用spring.main.banner-mode属性配置是否必须将banner输出到控制台(console),输出到日志文件(log)或是直接关闭banner生成(off)。

打印出来的banner被注册为一个单例bean,名字如下:springBootBanner。

1.4. Customizing SpringApplication

如果默认的SpringApplication类不能满足您的要求,你可以在本地创建一个实例化对象并进行配置。比如您想关闭banner的打印,可以做以下更改:

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

传递给SpringApplication的构造函数参数是Spring Bean的配置源。在大多数情况下,这些是对@Configuration类的引用,但是它们也可以是对XML配置或应该扫描的包的引用。

也可以通过使用application.properties属性文件 来配置SpringApplication。有关详细信息,请参阅SpringApplicationJavadoc。

1.5. Fluent Builder API

如果您需要构建一个ApplicationContext层次结构(具有父/子关系的多个上下文),或者您更喜欢使用“fluent”构建器API,那么您可以使用SpringApplicationBuilder。

SpringApplicationBuilder允许您将多个方法调用链接在一起,并包含允许您创建层次结构的父方法和子方法,如下面的示例所示(在启动类的主方法中构建):

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

创建ApplicationContext层次结构时存在一些限制。例如,Web组件必须包含在子上下文中,并且父上下文和子上下文都使用相同的环境。有关详细信息,请参阅SpringApplicationBuilder Javadoc。

1.6. Application Events and Listeners

除了通常的Spring框架事件(如ContextRefreshedEvent)之外,SpringApplication还发送一些附加的应用程序事件。

有些事件实际上是在创建ApplicationContext之前触发的,因此您不能用@Bean注册listener。使用SpringApplication.addListeners(…​)或SpringApplicationBuilder.listeners(…​)方法
注册它们。

无论应用程序是如何被创建,你都希望能自动注册这些listener,那么你可以添加一个文件
META-INF/spring.factories到您的项目中,并通过使用org.springframework.context.ApplicationListener键来引用您的listener,如下例所示:

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

当应用程序运行时,应用程序事件按以下顺序发送:

  1. ApplicationStartingEvent在运行开始时发送,但在任何处理之前发送,侦听器和初始化器的注册除外。
  2. 当要在上下文中使用的环境已知但在上下文创建之前,将发送ApplicationEnvironmentPreparedEvent。
  3. ApplicationContextInitializedEvent是在准备ApplicationContext和调用applicationcontextinitialalizer(但在加载任何bean定义之前)时发送的。
  4. ApplicationPreparedEvent在启动刷新之前,但在加载bean定义之后发送。
  5. ApplicationStartedEvent在上下文刷新之后,但在调用任何应用程序和命令行运行程序之前发送。
  6. 在调用任何应用程序和命令行运行程序之后,将发送ApplicationReadyEvent。它表明应用程序已经准备好为请求提供服务。
  7. 如果启动时出现异常,则发送ApplicationFailedEvent。

上面的列表只包括绑定到SpringApplication的SpringApplicationEvents。除此之外,以下事件也会在ApplicationPreparedEvent之后和ApplicationStartedEvent之前发布:

  1. 当刷新ApplicationContext时,将发送ContextRefreshedEvent。
  2. WebServerInitializedEvent在WebServer准备好之后发送。ServletWebServerInitializedEvent和ReactiveWebServerInitializedEvent分别是servlet和reactive变体。

您通常不需要使用应用程序事件,但是知道它们的存在是很方便的。在内部,Spring Boot使用事件来处理各种任务。

应用程序事件是使用Spring框架的事件发布机制发送的。此机制的一部分是确保在任何子上下文中发布给侦听器的事件也会发布给父上下文中的侦听器。因此,如果您的应用程序使用了SpringApplication实例的层次结构,则侦听器可能会接收同一类型应用程序事件的多个实例。

为了让侦听器能够区分其上下文的事件和子上下文的事件,它应该请求将其应用程序上下文注入,然后将注入的上下文与事件的上下文进行比较。上下文可以通过实现ApplicationContextAware 注入,如果listener 是bean,则可以通过使用@Autowired注入。

1.7. Web Environment

一个SpringApplication试图根据你的需求创建正确类型的ApplicationContext。用于确定WebApplicationType的算法相当简单:

  • 如果存在Spring MVC,则会创建使用AnnotationConfigServletWebServerApplicationContext
  • 如果Spring MVC不存在,而Spring WebFlux存在,则会创建使用AnnotationConfigReactiveWebServerApplicationContext
  • 否则,则会创建使用AnnotationConfigApplicationContext

这意味着,如果您在同一个应用程序中使用Spring MVC和来自Spring WebFlux的新WebClient,那么默认情况下将使用Spring MVC。

您可以通过调用setWebApplicationType(WebApplicationType)来轻松地覆盖它。还可以通过调用setApplicationContextClass(…)来完全控制ApplicationContext类型。

在JUnit测试中使用SpringApplication时,通常需要调用setWebApplicationType(WebApplicationType.NONE)。

1.8. Accessing Application Arguments

如果您需要访问传递给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"] 
		} 
	}

Spring Boot还向Spring Environment注册一个CommandLinePropertySource 。这还允许您通过使用@Value注释注入单个应用程序参数。

1.9. Using the ApplicationRunner or CommandLineRunner

如果您需要在SpringApplication启动后运行一些特定的代码,您可以实现ApplicationRunner或CommandLineRunner接口。这两个接口以相同的方式工作,并提供一个单一的运行方法,该方法在SpringApplication.run(…)完成之前被调用。

CommandLineRunner接口以简单的字符串数组的形式提供对应用程序参数的访问,而ApplicationRunner使用前面讨论的ApplicationArguments接口。下面的例子展示了一个带有run方法的CommandLineRunner:

import org.springframework.boot.*; 
import org.springframework.stereotype.*;
@Component 
public class MyBean implements CommandLineRunner {
 	public void run(String... args) { 
		// Do something...
 	}
 }

如果定义了几个必须以特定顺序调用的CommandLineRunner或ApplicationRunner bean,则可以另外实现org.springframework.core.Ordered接口
或使用org.springframework.core.annotation.Order注释。

1.10. Application Exit

每个SpringApplication向JVM注册一个关闭钩子,以确保ApplicationContext在退出时优雅地关闭。可以使用所有标准的Spring生命周期回调(例如DisposableBean接口或@PreDestroy注释)。

另外,beans可以实现org.springframework.boot.ExitCodeGenerator 接口,如果它们希望在调用SpringApplication.exit()时返回特定的退出代码。然后,可以将这个退出代码传递给System.exit(),将其作为状态代码返回,如下面的示例所示:

@SpringBootApplication 
public class ExitCodeApplication { 
@Bean 
public ExitCodeGenerator exitCodeGenerator() {
	 return () -> 42; 
	} 
public static void main(String[] args) { 
		System.exit(SpringApplication.exit(SpringApplication.run(ExitCodeApplication.class,args))); 
	}
}

此外,ExitCodeGenerator接口可以由异常实现。当遇到这样的异常时,Spring Boot将返回实现的getExitCode()方法提供的退出代码。

1.11. Admin Features

可以通过指定spring.application.admin.enabled来为应用程序启用admin-related的功能。这将在MBeanServer平台上公开SpringApplicationAdminMXBean。您可以使用此功能远程管理Spring启动应用程序。这个特性对于任何服务包装器实现都很有用。

如果您想知道应用程序在哪个HTTP端口上运行,请使用local.server.port的键获取属性。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

豢龙先生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值