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
方法来通知应用程序环境已经准备好了。
在前一步骤中,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
方法来运行所有的CommandLineRunner
和ApplicationRunner
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
메서드를 호출하여 모든 CommandLineRunner
및 ApplicationRunner
구성 요소를 실행합니다. 🎜위 내용은 SpringBoot 시작 프로세스는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!