【SpringApplication构造方法的正确认识】

119 阅读4分钟

如果您觉得这篇文章对您有帮助,请帮忙“关注”、“点赞”、“评价”、“收藏”,您的支持永远是我前进的动力~~~

SpringBoot源码解析(一):SpringApplication构造方法

Spring Boot是一个开源Java基础框架,用于创建独立、生产级的基于Spring框架的应用程序。它简化了基于Spring的应用程序的创建和部署过程,使得开发者能够快速地启动和运行Spring应用程序。SpringApplication是Spring Boot中的一个核心类,它负责启动整个Spring应用程序。本文将深入分析SpringApplication的构造方法,以帮助开发者更好地理解Spring Boot的启动过程,并探讨其在实际开发中的应用。

SpringApplication构造方法分析

SpringApplication类提供了两个构造方法,分别是:

  1. public SpringApplication(Class<?>... primarySources)
  2. public SpringApplication(ResourceLoader resourceLoader, Class<?>... primarySources)

第一个构造方法

第一个构造方法是最常见的使用方式,它接受一个或多个Class<?>类型的参数,这些参数通常是指定的Spring Boot应用程序的主类。

public SpringApplication(Class<?>... primarySources) {
    this(null, primarySources);
}

这个构造方法实际上是调用了第二个构造方法,并将resourceLoader参数设置为null

第二个构造方法

第二个构造方法提供了更多的自定义选项,它接受一个ResourceLoader类型的参数和一个或多个Class<?>类型的参数。

@SuppressWarnings({ "unchecked", "rawtypes" })
public SpringApplication(ResourceLoader resourceLoader, Class<?>... primarySources) {
    this.resourceLoader = resourceLoader;
    Assert.notNull(primarySources, "PrimarySources must not be null");
    this.primarySources = new LinkedHashSet<>(Arrays.asList(primarySources));
    // 推断web应用类型
    this.webApplicationType = WebApplicationType.deduceFromClasspath();
    // 加载并初始化 BootstrapRegistryInitializer及其实现类
    this.bootstrapRegistryInitializers = new ArrayList<>(
            getSpringFactoriesInstances(BootstrapRegistryInitializer.class));
    // 加载并初始化 ApplicationContextInitializer及其实现类
    setInitializers((Collection) getSpringFactoriesInstances(ApplicationContextInitializer.class));
    // 加载并初始化ApplicationListener及其实现类
    setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class));
    // 推断入口类
    this.mainApplicationClass = deduceMainApplicationClass();
}

在这个构造方法中,执行了以下关键操作:

  1. 设置资源加载器resourceLoader用于加载应用程序的资源,如果传入null,则使用默认的资源加载器。
  2. 设置主源primarySources是应用程序的主要配置源,通常是应用程序的主类。
  3. 推断Web应用类型:通过检查类路径上的jar文件来推断应用程序是否为Web应用。
  4. 加载BootstrapRegistryInitializer:这是Spring Boot启动过程中的一个初始化器,用于初始化应用程序的注册表。
  5. 加载ApplicationContextInitializer:这些初始化器用于在创建ApplicationContext之前进行一些自定义配置。
  6. 加载ApplicationListener:这些监听器用于监听Spring Boot启动过程中的事件。
  7. 推断入口类:通过分析类路径来确定应用程序的主类。

使用场景

1. 创建Spring Boot应用程序

在创建一个新的Spring Boot应用程序时,通常会定义一个主类,这个类会包含@SpringBootApplication注解,它会自动配置Spring Boot应用程序并启动SpringApplication。

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

在这个例子中,MyApp类作为主类,通过调用SpringApplication.run()方法启动应用程序。这个方法实际上会创建一个SpringApplication实例,并传递主类作为参数。

2. 自定义Spring Boot应用程序的启动过程

在某些情况下,可能需要自定义Spring Boot应用程序的启动过程。例如,可能需要在应用程序启动之前加载一些额外的配置文件,或者在启动过程中执行一些自定义逻辑。

public class CustomSpringBootApplication {
    public static void main(String[] args) {
        SpringApplication app = new SpringApplication(CustomSpringBootApplication.class);
        app.addInitializers(new CustomApplicationContextInitializer());
        app.run(args);
    }
}

在这个例子中,通过创建一个SpringApplication实例,并传递主类作为参数。然后,通过调用addInitializers()方法添加自定义的ApplicationContextInitializer,以在应用程序启动之前执行一些自定义逻辑。

3. 使用Spring Boot进行微服务开发

在微服务架构中,每个服务通常是一个独立的Spring Boot应用程序。通过使用SpringApplication类,可以轻松地启动和管理每个服务。

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

在这个例子中,UserService类作为用户服务的主类,通过调用SpringApplication.run()方法启动用户服务。这种方式使得每个服务都可以独立运行和部署,从而实现微服务架构的灵活性和可扩展性。

总结

通过分析SpringApplication的构造方法,我们可以看到Spring Boot在启动时进行了一系列的初始化操作,包括设置资源加载器、推断Web应用类型、加载初始化器和监听器等。这些操作为后续的Spring应用程序的创建和运行奠定了基础。

了解这些源码细节有助于开发者在遇到问题时进行调试和优化,同时也能够更好地利用Spring Boot提供的各种功能来构建高效、可维护的应用程序。

参考文献: