• SpringBoot官方文档学习(一)SpringApplication


    Springboot通过main方法启动,在许多情况下,委派给静态SpringApplication.run方法:

    public static void main(String[] args) {
        SpringApplication.run(MySpringConfiguration.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日志级别。也可以在application.properties文件中配置你想要的日志级别:

    logging.level.root=warn
    
    logging.level.org.springframework.web=debug
    
    logging.level.org.hibernate=error

    如果想关闭启动日志的话,可以配置:spring.main.log-startup-info=false。

    注:要在启动期间添加其他日志记录,可以覆盖SpringApplication类的logStartupInfo(boolean)方法。

     1.启动失败

    如果应用启动失败,注册FailureAnalyzers将会给你展示有用的错误信息和提供给你一些解决问题有效的措施。例如端口被占用时,将会展示以下的一些信息:

    ***************************
    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实现,我们也可以添加我们自己的实现。

    例如:

    扩展AbstractFailureAnalyzer抽象类FailureAnalyzer的实现主要是检查要处理的异常中是否存在指定的异常类型。您也可以对FailureAnalyzer接口进行扩展,以便您的实现只有在异常出现时才有机会处理该异常。如果由于某种原因无法处理该异常,请返回null以使另一个实现有机会处理该异常。

    FailureAnalyzer实现必须在META-INF/spring.factories中注册以下示例注册ProjectConstraintViolationFailureAnalyzer

    org.springframework.boot.diagnostics.FailureAnalyzer=
    com.example.ProjectConstraintViolationFailureAnalyzer  //自定义的实现

    注:如果需要访问BeanFactoryEnvironment,则实现FailureAnalyzer的同时,可以分别实现BeanFactoryAwareEnvironmentAware.

    如果没有故障分析器能够处理该异常,我们应该尽可能显示详细的、完整的情况报告来帮助我们判断问题和解决问题。因此,我们需要开启debug参数或为org.springframework.boot.autoconfigure.logging.ConditionEvaluationReportLoggingListener开启debug日志。

    使用java -jar启动应用时,我们可以通过以下发送来开启debug参数(命令行):

    java -jar myApp-0.0.1-SNAPSHOT.jar --debug

    2.延迟初始化

    如果SpringApplication允许使用延迟初始化,那么Beans将在app初始化完成之后加载。 可以缩减app启动时间。如果是web应用,当有http请求到来时,与该请求相关的beans才会初始化。

    优点:缩减app启动时间

    缺点:

    a.如果错误配置的Bean延迟初始化,启动期间不会发生故障, 会在初始化Bean的时候问题才出现。

    b.必须注意和确保JVM有足够的内存来容纳所有应用程序的bean。

    默认不会启动延迟初始化,若要启动该功能,建议先对JVM的堆大小进行适当的调整。

    启动延迟初始化的三种方法:

    a.SpringApplicationBuilder类的lazyInitialization 方法

    b.SpringApplication类的setLazyInitialization 方法

    c.设置spring.main.lazy-initialization=true

    注:a和b的方法在springboot新版本可以设置,老版本例如1.5.5没有。

    如果想对部分应用禁用bean的延迟初始化,可以使用@Lazy(false).

    3.自定义横幅(Banner)

    自定义横幅有两种方式:

    a.将banner.txt文件添加到类路径下 

    b. spring.banner.location属性设置为此文件的位置

    注:如果文件编码格式不是UTF-8,可以设置spring.banner.charset配置。除了文本文件,还可以添加banner.gif、banner.jpgbanner.png图像文件。图像将转换为ASCII艺术作品并打印在任何文字横幅上方。

    banner.txt文件内部,可以使用以下任意占位符:

    表1.标语变量
    变量描述

    ${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}(或${AnsiColor.NAME}${AnsiBackground.NAME}${AnsiStyle.NAME}

    NAMEANSI转义代码的名称在哪里有关AnsiPropertySource详细信息,请参见

    ${application.title}

    您的应用程序的标题,如中所述MANIFEST.MF例如Implementation-Title: MyApp打印为MyApp

    注:如果想以编码方式生成横幅,可以使用SpringApplication.setBanner(…​)方法。使用org.springframework.boot.Banner接口并实现自己的printBanner(...)方法。

    也可以使用spring.main.banner-mode配置来确定是否打印到控制台或日志中或不打印。OFF:不打印  CONSOLE:输出打印到控制台 LOG:打印到日志

    打印的banner将被注册为一个名为springBootBanner的singleton bean。

    4.自定义SpringApplication

    我们可以创建一个本地实例并对其进行自定义。例如关闭横幅:

    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。 具体的外部化配置请参考后面的介绍《SpringBoot学习(二)Externalized Configuration(外部化配置)》。

    完整的配置选项:参考javadoc文档 https://docs.spring.io/spring-boot/docs/2.2.2.RELEASE/api//org/springframework/boot/SpringApplication.html

    5.Fluent Builder API(流利的构建器api)

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

    SpringApplicationBuilder让要链接的多个方法调用,并且包括parentchild其让你创建层次结构,以显示在下面的示例性方法:

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

    注:创建ApplicationContext层次结构时有一些限制。例如:web组件必须包含在子上下文中,并且Environment父和子上下文都使用相同的组件。完整的信息参考:SpringApplicationBuilder Javadoc。

     https://docs.spring.io/spring-boot/docs/2.2.2.RELEASE/api//org/springframework/boot/builder/SpringApplicationBuilder.html

    6.应用程序事件和监听器

    除了通常的Spring Framework事件(例如)外ContextRefreshedEventSpringApplication还会发送一些其他应用程序事件。

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

    如果您希望这些侦听器自动注册,而不管创建应用程序的方式如何,都可以将META-INF/spring.factories文件添加到项目中,并使用org.springframework.context.ApplicationListener引用您的侦听器,如以下示例所示:

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

     应用程序事件在您的应用程序运行时按以下顺序发送:

    1. 在运行开始时,一个ApplicationStartingEvent将在进行任何处理之前(侦听器和初始化程序的注册除外)发送。

    2. 一个ApplicationEnvironmentPreparedEvent当被发送Environment到中已知的上下文中使用,但是在创建上下文之前。

    3. 准备ApplicationContext并调用ApplicationContextInitializers之后但在加载任何bean定义之前,将发送ApplicationContextInitializedEvent。

    4. ApplicationPreparedEvent在刷新开始之前但在加载bean定义之后发送 

    5. 一个ApplicationStartedEvent上下文已被刷新后发送,但是任何应用程序和命令行亚军都被调用前。

    6. ApplicationReadyEvent任何应用程序和命令行亚军被呼叫后发送。它指示该应用程序已准备就绪,可以处理请求。

    7. 一个ApplicationFailedEvent如果在启动时异常发送。

    上面的列表仅包含SpringApplicationEvent与绑定的SpringApplication除这些以外,以下事件也在之后ApplicationPreparedEvent和之前发布ApplicationStartedEvent

    1. ApplicationContext被刷新后,ContextRefreshedEvent将被发送。

    2. WebServer准备就绪后,WebServerInitializedEvent将被发送WebServerServletWebServerInitializedEventReactiveWebServerInitializedEvent分别是servlet和反应式变量。

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

    7.Web Environment

    一个SpringApplication试图创建正确类型的ApplicationContext代表您。确定WebApplicationType的算法非常简单:

    • 如果存在Spring MVC,AnnotationConfigServletWebServerApplicationContext则使用

    • 如果不存在Spring MVC但存在Spring WebFlux,AnnotationConfigReactiveWebServerApplicationContext则使用

    • 否则,AnnotationConfigApplicationContext使用

    这意味着,如果您WebClient在同一应用程序中使用Spring MVC和Spring WebFlux中的功能,则默认情况下将使用Spring MVC。您可以通过调用setWebApplicationType(WebApplicationType)轻松覆盖它

    也可以在使用ApplicationContext时通过调用setApplicationContextClass(…​)来实现完全控制。

    注:当在JUnit测试中使用SpringApplication时,它经常被描述为setWebApplicationType(WebApplicationType.NONE)。

     8.访问应用程序参数

    如果您需要访问传递给的应用程序参数,则SpringApplication.run(…​)可以注入org.springframework.boot.ApplicationArgumentsBean。ApplicationArguments接口提供对原始String[]参数以及已解析optionnon-option参数的访问,如以下示例所示:

    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也登记一个CommandLinePropertySource到Spring Environment。这将让你可以通过使用@Value来注入单个应用程序参数。


    9.使用ApplicationRunner或CommandLineRunner

    SpringApplication被启动时,你想要运行一些特定的代码时,则可以实现ApplicationRunnerCommandLineRunner接口。这两个接口以相同的方式工作,并提供一个单一的run方法,该方法在SpringApplication.run(…​)完成之前就被调用

    CommandLineRunner接口提供访问的应用程序的参数作为一个简单的字符串数组,而ApplicationRunner用途ApplicationArguments接口前面讨论。以下示例显示了一个CommandLineRunnerwith run方法:

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

    如果几个CommandLineRunnerApplicationRunner beans定义必须以一个特定的顺序被调用,您还可以实现org.springframework.core.Ordered接口或使用org.springframework.core.annotation.Order注解。

    10.应用退出

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

    另外,org.springframework.boot.ExitCodeGenerator如果bean 希望在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()方法提供的退出代码

    11.管理员功能

    通过指定spring.application.admin.enabled属性,可以为应用程序启用与管理员相关的功能这将SpringApplicationAdminMXBean在平台上公开MBeanServer您可以使用此功能来远程管理Spring Boot应用程序。此功能对于任何服务包装器实现也可能很有用。

     注:如果您想知道应用程序在哪个HTTP端口上运行,请通过键获取属性local.server.port。
  • 相关阅读:
    调用微信扫一扫接口
    Http错误代码解释
    php goto的用法
    Yii2.0-生成二维码实例
    飞鹅WiFi打印机配置,php调用接口
    HTML5 为什么只需要写 <!DOCTYPE HTML>?
    VueJs之 v-bind
    react 组件导出
    前端代码规范
    git与github的文件推送
  • 原文地址:https://www.cnblogs.com/muxi0407/p/12054652.html
Copyright © 2020-2023  润新知