【译】Spring Boot Features

【更新中】本文大部分内容翻译自官方文档https://docs.spring.io/spring-boot/docs/2.2.5.RELEASE/reference/html/spring-boot-features.html

1.Spring应用程序

The SpringApplication类提供了一种方便的方法来引导从main()方法启动的Spring应用程序。你可以委托给SpringApplication.run方法,如下所示:

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

应用程序启动,你应该看到类似以下输出:

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::   v2.2.2.RELEASE

2019-04-31 13:09:54.117  INFO 56603 --- [           main] o.s.b.s.app.SampleApplication            : Starting SampleApplication v0.1.0 on mycomputer with PID 56603 (/apps/myapp.jar started by pwebb)
2019-04-31 13:09:54.166  INFO 56603 --- [           main] ationConfigServletWebServerApplicationContext : Refreshing org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@6e5a8246: startup date [Wed Jul 31 00:08:16 PDT 2013]; root of context hierarchy
2019-04-01 13:09:56.912  INFO 41370 --- [           main] .t.TomcatServletWebServerFactory : Server initialized with port: 8080
2019-04-01 13:09:57.501  INFO 41370 --- [           main] o.s.b.s.app.SampleApplication            : Started SampleApplication in 2.992 seconds (JVM running for 3.658)

默认情况下,会显示INFO日志消息,包括一些相关的启动细节,比如启动应用程序的用户。

如果你需要除了INFO级别的日志信息,你可以设置日志级别

应用程序版本是从主程序类包中的实现版本确定的。

设置spring.main.log-startup-infofalse可以关闭启动日志信息记录。

这还将关闭应用程序活动配置文件的日志记录。

要在启动期间添加额外的日志记录,您可以在SpringApplication的子类中重写logStartupInfo(boolean)

1.1 启动失败

如果您的应用程序启动失败,注册的FailureAnalyzers将有机会提供专用的错误消息和修复问题的具体操作。

例如,如果您在端口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提供了很多FailureAnalyzers实现,你也可以创建自定义的故障分析器

如果没有故障分析器能处理异常,你也可以显示完整的条件报告,以便更好地理解出错的原因。您需要为org.springframework.boot.autoconfigure.logging.ConditionEvaluationReportLoggingListener启用debug属性启用DEBUG日志记录

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

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

1.2 延迟初始化

开启延迟初始化可以减少应用程序所需的世界,在web应用程序中,启用延迟初始化将导致在接收到HTTP请求之前许多与web相关的bean不会被初始化。

延迟初始化的缺点是较晚得发现应用程序中的问题。如果一个错误配置的bean是延迟初始化的,在启动期间不会出现故障,故障会发生bean被初始化的时候。

还必须注意确保JVM有足够的内存来容纳应用程序的所有bean,而不仅仅是只容纳那些在启动期间初始化的bean。

由于这些原因,延迟初始化默认是禁用的,建议在开启延迟初始化之前对JVM的堆大小进行微调(fine-tuning)。

用编程方式开启延迟初始化:

使用SpringApplicationBuilderlazyInitialization方法:

SpringApplicationBuilder springApplicationBuilder = new SpringApplicationBuilder();
springApplicationBuilder.lazyInitialization(true);

使用SpringApplicationsetLazyInitialization方法:

SpringApplication springApplication = new SpringApplication(Application20200106.class);
springApplication.setLazyInitialization(true);

配置文件开启延迟从初始化:

使用spring.main.lazy-initialization属性:

spring.main.lazy-initialization=true

如果你希望一部分bean使用延迟初始化,一部分bean禁用延迟初始化,你可以使用@Lazy(false)注解。

  • lazy = true,表示延迟,默认为true
  • lazy = false,表示不延迟

1.3 自定义Banner

classpath中添加一个banner.txt文件或者设置spring.banner.location属性来改变在启动期间打印的banner。

如果文件编码不是UTF-8,需要设置spring.banner.charset

除了文本文件,还可以在classpath中添加banner.gifbanner.jpgbanner.png图片文件。或者设置spring.banner.image.location属性。

图片被转换成ASCII码打印在任何文本banner上方。

banner.txt文件中,可以使用下列占位符:

表1 Banner变量

变量 说明
${application.version} 应用程序的版本号,和MANIFEST.MF一样的声明。例如,Implementation-Version: 1.0打印成1.0
${application.formatted-version} 应用程序的版本号,和MANIFEST.MF一样,按照格式显示(用圆括号括起来并且加上前缀v)。如(v1.0)
${spring-boot.version} 你在使用的Spring Boot版本,如2.2.2.RELEASE
${spring-boot.formatted-version} 你在使用的Spring Boot版本,按照格式显示(用圆括号括起来并且加上前缀v)。如v2.2.2.RELEASE
${Ansi.NAME} (or ${AnsiColor.NAME}, ${AnsiBackground.NAME}, ${AnsiStyle.NAME}) NAME是ANSI转义码的名称,详情参见AnsiPropertySource
${application.title} 应用程序的Title,和MANIFEST.MF一样。如Implementation-Title: MyApp打印成MyApp

如果你想用编程的方式生成一个banner,可以使用SpringApplication.setBanner(…)

实现org.springframework.boot.Banner接口并重写printBanner()方法。

You can also use the spring.main.banner-mode property to determine if the banner has to be printed on System.out (console), sent to the configured logger (log), or not produced at all (off).

你也可以使用spring.main.banner-mode属性控制banner是否在System.out(console)被打印,或者发送到已配置的日志程序,或者关闭。

打印banner的bean被注册成一个单例bean,名字为:springBootBanner

1.4 自定义SpringApplication

如果默认的SpringApplication不是你的菜,你可以创建一个本地实例并对其设置。例如,关闭banner:

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

传给SpringApplication的构造方法参数是Spring beans的配置源。在大多数情况下,都是引用@Configuration类,但是也可以引用XML配置或引用被扫描的包。

引用XML配置:

ResourceLoader resourceLoader = new ClassPathXmlApplicationContext("config/spring/user/applicationContext-user.xml");
SpringApplication springApplication = new SpringApplication(resourceLoader,Application20200106.class);

引用被扫描的包:

配置类UserConfiguration

package cn.shrmus.springboot.demo20200106.configuration;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@ComponentScan("cn.shrmus.springboot.demo20200106.user")
@Configuration
public class UserConfiguration {
   
}

启动类Application20200106

@Import(value = cn.shrmus.springboot.demo20200106.configuration.UserConfiguration.class)
@SpringBootApplication
public class Application20200106{
   
    public static void main(String[] args) {
   
        ResourceLoader resourceLoader = new AnnotationConfigApplicationContext("cn.shrmus.springboot.demo20200106.user");
//        ResourceLoader resourceLoader = new AnnotationConfigApplicationContext(cn.shrmus.springboot.demo20200106.configuration.UserConfiguration.class);

        SpringApplication springApplication = new SpringApplication(resourceLoader,Application20200106.class);

        ConfigurableApplicationContext configurableApplicationContext = springApplication.run(args);

        UserController userController = configurableApplicationContext.getBean(UserController.class);
        System.out.println(userController);

        SpringApplication.exit(configurableApplicationContext);
    }

也可以使用application.properties文件配置SpringApplication,详情参考外部化配置

要查看SpringApplication的完整配置,参考SpringApplicationJavadoc

1.5 构建流式API

如果需要构建一个ApplicationCOntext层次结构(具有父/子关系的多个上下文),或者你更喜欢使用构建“流式”API,你可以使用SpringApplicationBuilder

The SpringApplicationBuilderlets you chain together multiple method calls and includes parentand childmethods that let you create a hierarchy, as shown in the following example:

使用SpringApplicationBuilder将包含parentchild方法等多个方法的调用都链在一起,以此创建一个层次结构,如下:

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

创建ApplicationContext层次结构会有一些限制,Web组件被包含在子上下文中,父上下文和子上下文都使用同一个Environment。阅读SpringApplicationBuilderJavadoc查看详情。

1.6 Application事件和监听器

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

有些事件是在创建ApplicationContext之前触发的,所以不能将监听器注册成@Bean,你可以使用SpringApplication.addListeners(…)方法或SpringApplicationBuilder.listeners(…)方法注册它们。

如果你希望监听器能自动注册,不管应用程序时如何创建的,你可以在META-INF/spring.factories文件中使用org.springframework.context.ApplicationListener添加监听器的引用。如下:

org.springframework.context.ApplicationListener=cn.shrmus.springboot.demo20200106.listener.MyListener

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值