>  기사  >  Java  >  SpringBoot 시작 프로세스는 무엇입니까?

SpringBoot 시작 프로세스는 무엇입니까?

PHPz
PHPz앞으로
2023-05-21 23:14:548128검색

SpringBoot 시작 프로세스 소개

SpringBoot 애플리케이션의 시작 프로세스는 다음 단계로 나눌 수 있습니다.

  • 애플리케이션 컨텍스트 로드

  • 애플리케이션의 모든 구성 요소 스캔

  • 애플리케이션 자동 구성 환경

  • 임베디드 웹 서버 시작

애플리케이션 컨텍스트 로드

SpringBoot 애플리케이션의 모든 구성 요소를 포함하는 컨테이너가 컨텍스트입니다. 시작 프로세스 중에 SpringBoot는 이 컨테이너를 로드하고 초기화합니다.

이 단계의 소스 코드는 SpringApplication 클래스에 있습니다. 특히 SpringApplication 클래스의 run 메서드는 이 프로세스의 진입점입니다. 이 메서드에서 Spring Boot는 createApplicationContext 메서드를 호출하여 애플리케이션 컨텍스트를 생성합니다. SpringApplication类中。具体来说,SpringApplication类的run方法是这个过程的入口点。在这个方法中,Spring Boot会通过调用createApplicationContext方法来创建应用程序上下文。

下面是createApplicationContext方法的源代码:

protected ConfigurableApplicationContext createApplicationContext() {
    Class<?> contextClass = this.applicationContextClass;
    if (contextClass == null) {
        try {
            switch (this.webApplicationType) {
                case SERVLET:
                    contextClass = Class.forName(DEFAULT_SERVLET_WEB_CONTEXT_CLASS);
                    break;
                case REACTIVE:
                    contextClass = Class.forName(DEFAULT_REACTIVE_WEB_CONTEXT_CLASS);
                    break;
                default:
                    contextClass = Class.forName(DEFAULT_CONTEXT_CLASS);
            }
        }
        catch (ClassNotFoundException ex) {
            throw new IllegalStateException(
                    "Unable to create a default ApplicationContext, " +
                    "please specify an ApplicationContextClass", ex);
        }
    }
    return (ConfigurableApplicationContext) BeanUtils.instantiateClass(contextClass);
}

在这个方法中,SpringBoot 会根据应用程序类型(Servlet或Reactive)选择合适的上下文类。接着,使用 Java 反射机制来实例化该类并返回一个可配置的应用程序上下文对象。

扫描应用程序中的所有组件

在上一步中,SpringBoot创建了应用程序上下文。在此阶段,SpringBoot会扫描应用程序中的所有组件并将它们注册到应用程序上下文中。

这个步骤的源代码在SpringApplication类中的scan方法中。具体来说,在这个方法中,SpringBoot 会创建一个SpringBootBeanDefinitionScanner对象,并使用它来扫描应用程序中的所有组件。

下面是scan方法的源代码:

private void scan(String... basePackages) {
    if (ObjectUtils.isEmpty(basePackages)) {
        return;
    }
    ClassPathScanningCandidateComponentProvider scanner = new ClassPathScanningCandidateComponentProvider(
            this.includeFilters, this.excludeFilters, this.resourceLoader);
    scanner.setResourceLoader(this.resourceLoader);
    scanner.setEnvironment(this.environment);
    scanner.setIncludeAnnotationConfig(this.useAnnotatedConfig);
    scanner.addExcludeFilter(new AbstractTypeHierarchyTraversingFilter(false, false) {
        @Override
        protected boolean matchClassName(String className) {
            return getExcludeClassNames().contains(className);
        }
    });
    for (String basePackage : basePackages) {
        scanner.findCandidateComponents(basePackage).forEach(this.componentDefinitions::add);
    }
}

在这个方法中,SpringBoot 会创建一个ClassPathScanningCandidateComponentProvider对象,并使用它来扫描应用程序中的所有组件。这个对象会扫描指定包路径下的所有类,并将它们转换为 Spring 的 Bean 定义。这些 Bean 定义将被注册到应用程序上下文中。

自动配置应用程序环境

SpringBoot在前一步将应用程序中的所有组件注册到应用程序上下文中。SpringBoot会自动配置应用程序环境,其中包括数据源、事务管理器和JPA配置。

这个步骤的源代码在SpringApplication类中的configureEnvironment方法中。在这个方法中,Spring Boot会创建一个SpringApplicationRunListeners对象,并使用它来配置应用程序环境。

下面是configureEnvironment方法的源代码:

private void configureEnvironment(ConfigurableEnvironment environment, String[] args) {
    if (this.addCommandLineProperties) {
        ApplicationArguments applicationArguments = new DefaultApplicationArguments(args);
        environment.getPropertySources().addLast(new CommandLinePropertySource(applicationArguments));
    }
    this.listeners.environmentPrepared(environment);
    if (this.logStartupInfo) {
        this.logStartupInfo(environment);
    }
    ConfigurationPropertySources.attach(environment);
    Binder.get(environment).bind(ConfigurationPropertyName.EMPTY, Bindable.ofInstance(this.sources));
    if (!this.isCustomEnvironment) {
        EnvironmentConverter.configureEnvironment(environment, this.deduceEnvironmentClass());
    }
    this.listeners.environmentPrepared(environment);
}

在这个方法中,SpringBoot 会创建一个ApplicationArguments对象,并将其转换为一个命令行属性源。然后,它会调用listeners中的environmentPrepared方法来通知应用程序环境已经准备好了。随后,SpringBoot 会绑定属性源到应用程序环境中,并调用listeners中的environmentPrepared方法来通知应用程序环境已经准备好了。

启动嵌入式Web服务器

在前一步骤中,SpringBoot已自动完成了应用程序环境的配置。在这一步,SpringBoot将启动嵌入式Web服务器,以便应用程序提供Web服务。

这个步骤的源代码在SpringApplication类中的run方法中。具体来说,在这个方法中,SpringBoot 会根据应用程序类型(Servlet或Reactive)选择合适的嵌入式Web服务器,并使用它来启动应用程序。

下面是run方法的源代码:

public ConfigurableApplicationContext run(String... args) {
    StopWatch stopWatch = new StopWatch();
    stopWatch.start();
    ConfigurableApplicationContext context = null;
    Collection<SpringBootExceptionReporter> 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;
}

在这个方法中,SpringBoot 会使用一个StopWatch对象来计算应用程序启动时间。然后,它会调用listeners中的starting方法来通知应用程序即将启动。接着,SpringBoot 会准备应用程序环境,并使用它来创建应用程序上下文。随后,SpringBoot 会调用listeners中的started方法来通知应用程序已经启动。最后,SpringBoot 会调用callRunners方法来运行所有的CommandLineRunnerApplicationRunner

다음은 createApplicationContext 메서드의 소스 코드입니다. 🎜rrreee🎜이 메서드에서 SpringBoot는 애플리케이션 유형(Servlet 또는 Reactive)에 따라 적절한 컨텍스트 클래스를 선택합니다. 다음으로, Java 리플렉션 메커니즘을 사용하여 클래스를 인스턴스화하고 구성 가능한 애플리케이션 컨텍스트 객체를 반환합니다. 🎜🎜애플리케이션의 모든 구성요소를 스캔하세요🎜🎜이전 단계에서 SpringBoot는 애플리케이션 컨텍스트를 생성했습니다. 이 단계에서 SpringBoot는 애플리케이션의 모든 구성 요소를 검색하고 이를 애플리케이션 컨텍스트에 등록합니다. 🎜🎜이 단계의 소스 코드는 SpringApplication 클래스의 scan 메서드에 있습니다. 특히 이 메서드에서 SpringBoot는 SpringBootBeanDefinitionScanner 개체를 생성하고 이를 사용하여 애플리케이션의 모든 구성 요소를 검색합니다. 🎜🎜다음은 scan 메소드의 소스 코드입니다: 🎜rrreee🎜이 메소드에서 SpringBoot는 ClassPathScanningCandidateComponentProvider 객체를 생성하고 이를 사용하여 애플리케이션의 모든 구성 요소를 스캔합니다. . 이 객체는 지정된 패키지 경로 아래의 모든 클래스를 검색하고 이를 Spring 빈 정의로 변환합니다. 이러한 Bean 정의는 애플리케이션 컨텍스트에 등록됩니다. 🎜🎜애플리케이션 환경 자동 구성🎜🎜SpringBoot는 애플리케이션의 모든 구성 요소를 이전 단계의 애플리케이션 컨텍스트에 등록합니다. SpringBoot는 데이터 소스, 트랜잭션 관리자, JPA 구성을 포함한 애플리케이션 환경을 자동으로 구성합니다. 🎜🎜이 단계의 소스 코드는 SpringApplication 클래스의 configureEnvironment 메서드에 있습니다. 이 방법에서 Spring Boot는 SpringApplicationRunListeners 객체를 생성하고 이를 사용하여 애플리케이션 환경을 구성합니다. 🎜🎜다음은 configureEnvironment 메서드의 소스 코드입니다. 🎜rrreee🎜이 메서드에서 SpringBoot는 ApplicationArguments 개체를 생성하고 이를 명령줄 속성 소스로 변환합니다. 그런 다음 listeners에서 environmentPrepared 메서드를 호출하여 환경이 준비되었음을 애플리케이션에 알립니다. 그런 다음 SpringBoot는 속성 소스를 애플리케이션 환경에 바인딩하고 listeners에서 environmentPrepared 메서드를 호출하여 환경이 준비되었음을 애플리케이션에 알립니다. 🎜🎜임베디드 웹 서버 시작🎜🎜이전 단계에서 SpringBoot는 자동으로 애플리케이션 환경 구성을 완료했습니다. 이 단계에서 SpringBoot는 애플리케이션이 웹 서비스를 제공할 수 있도록 임베디드 웹 서버를 시작합니다. 🎜🎜이 단계의 소스 코드는 SpringApplication 클래스의 run 메서드에 있습니다. 특히 이 방법에서는 SpringBoot가 애플리케이션 유형(Servlet 또는 Reactive)을 기반으로 적절한 내장 웹 서버를 선택하고 이를 사용하여 애플리케이션을 시작합니다. 🎜🎜다음은 run 메서드의 소스 코드입니다. 🎜rrreee🎜이 메서드에서 SpringBoot는 StopWatch 개체를 사용하여 애플리케이션 시작 시간을 계산합니다. 그런 다음 listeners에서 starting 메서드를 호출하여 애플리케이션이 곧 시작될 것임을 알립니다. 다음으로 SpringBoot는 애플리케이션 환경을 준비하고 이를 사용하여 애플리케이션 컨텍스트를 생성합니다. 이후 SpringBoot는 listeners에서 started 메서드를 호출하여 애플리케이션이 시작되었음을 알립니다. 마지막으로 SpringBoot는 callRunners 메서드를 호출하여 모든 CommandLineRunnerApplicationRunner 구성 요소를 실행합니다. 🎜

위 내용은 SpringBoot 시작 프로세스는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제