SpringApplicationBuilder的全面剖析

Spring Boot是当今最受欢迎的Java微服务框架之一,SpringApplicationBuilder是其中一个比较重要的组件,它是Spring Boot应用程序的构建器,用于构建Spring Boot上下文、注册bean和配置Spring Boot特性。在本文中,我们将深入研究SpringApplicationBuilder,从多个方面对它进行详细的阐述。

一、SpringApplicationBuilder的基本介绍

SpringApplicationBuilder是Spring Boot应用程序的构建器,是一个链式API,可以用于构建Spring Boot上下文、注册bean和配置Spring Boot特性。

以下是一个简单的Spring Boot应用程序实例代码:

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

SpringApplication.run()方法用来运行Spring Boot应用程序,它需要两个参数:启动类MyApplication.class和运行参数args。SpringApplication.run()方法内部会创建一个SpringApplicationBuilder对象来构建Spring Boot上下文。

下面是一个Spring Boot应用程序的构建过程:

public static ConfigurableApplicationContext run(Class primarySource, String... args) {
    return new SpringApplication(primarySource).run(args);
}

public SpringApplication(Object... sources) {
    this(null, sources);
}

public SpringApplication(ResourceLoader resourceLoader, Class... primarySources) {
    this.resourceLoader = resourceLoader;
    Assert.notNull(primarySources, "PrimarySources must not be null");
    this.primarySources = new LinkedHashSet(Arrays.asList(primarySources));
    this.webApplicationType = WebApplicationType.deduceFromClasspath();
}

public ConfigurableApplicationContext run(String... args) {
    StopWatch stopWatch = new StopWatch();
    stopWatch.start();
    ConfigurableApplicationContext context = null;
    Collection exceptionReporters = new ArrayList();
    configureHeadlessProperty();
    SpringApplicationRunListeners listeners = getRunListeners(args);
    listeners.starting();
    try {
        ApplicationArguments applicationArguments = new DefaultApplicationArguments(args);
        ConfigurableEnvironment environment = prepareEnvironment(listeners, applicationArguments);
        configureIgnoreBeanInfo(environment);
        Banner printedBanner = printBanner(environment);
        context = createApplicationContext();
        exceptionReporters = getSpringFactoriesInstances(SpringBootExceptionReporter.class, new Class[] {ConfigurableApplicationContext.class}, context);
        prepareContext(context, environment, listeners, applicationArguments, printedBanner);
        refreshContext(context);
        afterRefresh(context, applicationArguments);
        stopWatch.stop();
        if (this.logStartupInfo) {
            new StartupInfoLogger(this.mainApplicationClass).logStarted(getApplicationLog(), stopWatch);
        }
        listeners.started(context);
        callRunners(context, applicationArguments);
    }
    catch (Throwable ex) {
        handleRunFailure(context, ex, exceptionReporters, listeners);
        throw new IllegalStateException(ex);
    }

    try {
        listeners.running(context);
    }
    catch (Throwable ex) {
        handleRunFailure(context, ex, exceptionReporters, null);
        throw new IllegalStateException(ex);
    }
    return context;
}

Spring Boot应用程序的构建可以细分为以下几个步骤:

  1. 创建SpringApplication对象
  2. 设置应用程序启动类和运行参数
  3. 创建SpringApplicationBuilder对象
  4. 使用SpringApplicationBuilder构建Spring Boot上下文
  5. 准备配置环境、打印banner和创建ApplicationContext对象
  6. 刷新ApplicationContext
  7. 启动Spring Boot应用程序

二、SpringApplicationBuilder的链式调用

SpringApplicationBuilder是一个链式API,可以通过链式调用来配置Spring Boot应用程序。下面是一个链式调用实例:

new SpringApplicationBuilder()
        .sources(MyApplication.class)
        .bannerMode(Banner.Mode.OFF)
        .web(WebApplicationType.NONE)
        .run(args);

在这个例子中,我们指定了启动类、关闭banner和设置应用程序类型为非Web类型。该代码等价于以下代码:

SpringApplicationBuilder builder = new SpringApplicationBuilder();
builder.sources(MyApplication.class);
builder.bannerMode(Banner.Mode.OFF);
builder.web(WebApplicationType.NONE);
builder.run(args);

链式调用可以简化代码,使代码更加清晰易懂。

三、SpringApplicationBuilder的父子关系

SpringApplicationBuilder支持父子关系,可以用于构建多个应用程序上下文之间的依赖关系。下面是一个父子关系的代码示例:

SpringApplicationBuilder parentBuilder = new SpringApplicationBuilder(ParentApplication.class);
parentBuilder.child(Application1.class).run(args);
parentBuilder.child(Application2.class).run(args);

在上面的示例中,我们首先创建了一个父SpringApplicationBuilder,然后通过child()方法创建了两个子SpringApplicationBuilder,并且使用run()方法来启动这两个子应用程序。

四、SpringApplicationBuilder的高级应用

1. 添加自定义属性

我们可以通过properties()方法将自定义属性添加到应用程序上下文中:

new SpringApplicationBuilder(MyApplication.class)
        .properties("my.property=value")
        .run(args);

在上面的示例中,我们向上下文中添加了一个名为my.property的属性,值为value。

2. 添加多个启动类

我们可以通过sources()方法添加多个应用程序启动类:

new SpringApplicationBuilder(MyApplication.class, AnotherApplication.class)
        .run(args);

在上面的示例中,我们同时使用MyApplication.class和AnotherApplication.class两个启动类。

3. 添加配置类

我们可以通过initializers()方法配置应用程序初始器:

new SpringApplicationBuilder(MyApplication.class)
        .initializers(new MyInitializer())
        .run(args);

在上面的示例中,我们通过MyInitializer类来配置应用程序。

4. 自定义日志记录器

我们可以通过logback.xml等方式自定义日志记录器。下面是一个自定义日志记录器的示例:

new SpringApplicationBuilder(MyApplication.class)
        .logStartupInfo(false)
        .web(WebApplicationType.NONE)
        .bannerMode(Banner.Mode.OFF)
        .run(args);

在上面的示例中,我们禁用了日志记录器和关闭了应用程序。

总结

SpringApplicationBuilder是Spring Boot应用程序的构建器,是一个链式API,可以用于构建Spring Boot上下文、注册bean和配置Spring Boot特性。在本文中,我们学习了SpringApplicationBuilder的基本介绍、链式调用、父子关系和高级应用。

完整的代码示例:

@SpringBootApplication
public class MyApplication {
    public static void main(String[] args) {
        new SpringApplicationBuilder()
                .sources(MyApplication.class)
                .bannerMode(Banner.Mode.OFF)
                .web(WebApplicationType.NONE)
                .run(args);
    }
}

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/304146.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝的头像小蓝
上一篇 2025-01-01 11:04
下一篇 2025-01-01 11:04

相关推荐

  • Python应用程序的全面指南

    Python是一种功能强大而简单易学的编程语言,适用于多种应用场景。本篇文章将从多个方面介绍Python如何应用于开发应用程序。 一、Web应用程序 目前,基于Python的Web…

    编程 2025-04-29
  • Python zscore函数全面解析

    本文将介绍什么是zscore函数,它在数据分析中的作用以及如何使用Python实现zscore函数,为读者提供全面的指导。 一、zscore函数的概念 zscore函数是一种用于标…

    编程 2025-04-29
  • 全面解读数据属性r/w

    数据属性r/w是指数据属性的可读/可写性,它在程序设计中扮演着非常重要的角色。下面我们从多个方面对数据属性r/w进行详细的阐述。 一、r/w的概念 数据属性r/w即指数据属性的可读…

    编程 2025-04-29
  • Python计算机程序代码全面介绍

    本文将从多个方面对Python计算机程序代码进行详细介绍,包括基础语法、数据类型、控制语句、函数、模块及面向对象编程等。 一、基础语法 Python是一种解释型、面向对象、动态数据…

    编程 2025-04-29
  • Matlab二值图像全面解析

    本文将全面介绍Matlab二值图像的相关知识,包括二值图像的基本原理、如何对二值图像进行处理、如何从二值图像中提取信息等等。通过本文的学习,你将能够掌握Matlab二值图像的基本操…

    编程 2025-04-28
  • 疯狂Python讲义的全面掌握与实践

    本文将从多个方面对疯狂Python讲义进行详细的阐述,帮助读者全面了解Python编程,掌握疯狂Python讲义的实现方法。 一、Python基础语法 Python基础语法是学习P…

    编程 2025-04-28
  • 全面解析Python中的Variable

    Variable是Python中常见的一个概念,是我们在编程中经常用到的一个变量类型。Python是一门强类型语言,即每个变量都有一个对应的类型,不能无限制地进行类型间转换。在本篇…

    编程 2025-04-28
  • Zookeeper ACL 用户 anyone 全面解析

    本文将从以下几个方面对Zookeeper ACL中的用户anyone进行全面的解析,并为读者提供相关的示例代码。 一、anyone 的作用是什么? 在Zookeeper中,anyo…

    编程 2025-04-28
  • Python合集符号全面解析

    Python是一门非常流行的编程语言,在其语法中有一些特殊的符号被称作合集符号,这些符号在Python中起到非常重要的作用。本文将从多个方面对Python合集符号进行详细阐述,帮助…

    编程 2025-04-28
  • Switchlight的全面解析

    Switchlight是一个高效的轻量级Web框架,为开发者提供了简单易用的API和丰富的工具,可以快速构建Web应用程序。在本文中,我们将从多个方面阐述Switchlight的特…

    编程 2025-04-28

发表回复

登录后才能评论