springboot 실행 프로세스

springboot 알아보기

원리를 시작 springboot

SpringBoot 전체 시동 프로세스는 두 단계로 분할된다하십시오 SpringApplication 객체의 초기화는이 오브젝트의 런 메소드를 실행한다.

1 SpringApplication 초기화

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 = deduceWebApplicationType();
        setInitializers((Collection) getSpringFactoriesInstances(
                ApplicationContextInitializer.class));
        setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class));
        this.mainApplicationClass = deduceMainApplicationClass();
    }

2, 봄 부팅 부팅 프로세스

봄 부팅 전체 시작 프로세스 응용 프로그램은 봄에 만든 패키지, 확장의 많은에 근거, 사실 본질적으로 SpringApplication.run 방법에 캡슐화된다.

public ConfigurableApplicationContext run(String... args) {
        StopWatch stopWatch = new StopWatch();
        stopWatch.start();
        ConfigurableApplicationContext context = null;
        Collection<SpringBootExceptionReporter> exceptionReporters = new ArrayList<>();
        configureHeadlessProperty();
//1.通过SpringFactoriesLoader查找并加载所有的SpringApplicationRunListeners,
//SpringApplicationRunListener 接口的作用主要就是在Spring Boot 启动初始化的过程中可以通过SpringApplicationRunListener接口回调来让用户在启动的各个流程中可以加入自己的逻辑。)


//starting()方法通知所有的SpringApplicationRunListeners:应用开始启动了
        SpringApplicationRunListeners listeners = getRunListeners(args);
        listeners.starting();
        try {
//2.创建并配置当前应用将要使用的Environment Environment 读取配置文件 
            ApplicationArguments applicationArguments = new DefaultApplicationArguments(
                    args);
            ConfigurableEnvironment environment = prepareEnvironment(listeners,
                    applicationArguments);
            configureIgnoreBeanInfo(environment);
//3.打印banner
            Banner printedBanner = printBanner(environment);
//4.根据是否是web项目,来创建不同的ApplicationContext容器
            context = createApplicationContext();
//5.创建一系列FailureAnalyzer 
//FailureAnalyzer是一种很好的方式在启动时拦截异常并将其转换为易读的消息
            exceptionReporters = getSpringFactoriesInstances(
                    SpringBootExceptionReporter.class,
                    new Class[] { ConfigurableApplicationContext.class }, context);
//6.初始化ApplicationContext
            prepareContext(context, environment, listeners, applicationArguments,
                    printedBanner);
//7.调用ApplicationContext的refresh()方法,刷新容器
            refreshContext(context);
//8.查找当前context中是否注册有CommandLineRunner和ApplicationRunner,如果有则遍历执行它们。
            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, listeners, exceptionReporters, ex);
            throw new IllegalStateException(ex);
        }
        listeners.running(context);
        return context;
    }

찾기 및 SpringFactoriesLoader 모든 SpringApplicationRunListeners로드, 시작 () 메서드를 호출하여 모든 SpringApplicationRunListeners 통지 1. 응용 프로그램을 시작하기 시작합니다. (기본적으로 이벤트 발행인이다 SpringApplicationRunListeners, 그것은 이벤트 리스너 (만약 ApplicationListener)는이 사건에 관심을 가지고있는 경우 시간 SpringBoot 응용 프로그램 시작에서 다른 지점에서 이벤트를 다른 응용 프로그램 유형 (가 ApplicationEvent)를 발행, 당신은 수신하고 처리 할 수 있습니다)
SpringApplicationRunListeners 소스를 보면 :

public interface SpringApplicationRunListener {

    // 运行run方法时立即调用此方法,可以用户非常早期的初始化工作
    void starting();
    
    // Environment准备好后,并且ApplicationContext创建之前调用
    void environmentPrepared(ConfigurableEnvironment environment);

    // ApplicationContext创建好后立即调用
    void contextPrepared(ConfigurableApplicationContext context);

    // ApplicationContext加载完成,在refresh之前调用
    void contextLoaded(ConfigurableApplicationContext context);

    // 当run方法结束之前调用
    void finished(ConfigurableApplicationContext context, Throwable exception);

}

.SpringApplicationRunListener 수신기는 하나의 구현 클래스입니다 : EventPublishingRunListener. 코드 만 EventPublishingRunListener 인스턴스에 얻을 것이다으로 ① 시작, 내용에서의 모습 () 메소드를 보자 :

public void starting() {
    // 发布一个ApplicationStartedEvent
    this.initialMulticaster.multicastEvent(new ApplicationStartedEvent(this.application, this.args));
}


만들기 2. 및 구성 환경 현재 응용 프로그램이 사용됩니다, 환경은 현재 운영 두 가지 측면을 추상화 환경의 응용 프로그램을 설명하는 데 사용 : 구성 파일 (프로파일) 및 특성 (속성), 서로 다른 환경 (예 : 생산 속성은 구성 파일, 환경 변수, 커맨드 라인 파라미터의 공급원으로부터 수득 될 수 있지만 환경은 시험판 환경), 다른 정보를 사용할 수있다. 환경 응용 프로그램 전반에 걸쳐 언제든지 준비가되면 따라서, 당신은 환경에서 자원을 얻을 수 있습니다.

  • 여부 환경의 존재를 확인, 존재하지 않는 생성 (웹 프로젝트를 만든 경우 - - - - -
    StandardEnvironment을 StandardServletEnvironment를, 또는 생성)
  • 구성 환경 : 구성 프로파일 및 특성
  • environmentPrepared의 전화 SpringApplicationRunListener () 메소드는, 통지 이벤트 리스너 : 환경의 응용 프로그램 준비

(정의 수) 배너 인쇄 3.
이 다른 ApplicationContext에 컨테이너를 생성하는 웹 프로젝트 여부에 따라
FailureAnalyzer 일련 만들기 5. (절편 이상) 생성 프로세스가 정지 한 후, SpringFactoriesLoader 통해 FailureAnalyzer 인터페이스를 달성하기 위해 모든 클래스의 취득 대응하는 인스턴스를 생성한다. 분석 오류에 대한 FailureAnalyzer 및 진단 정보를 제공합니다.
6. 초기화의 ApplicationContext

将准备好的Environment(配置信息)设置给ApplicationContext
遍历调用所有的ApplicationContextInitializer的initialize()方法来对已经创建好的ApplicationContext进行进一步的处理
调用SpringApplicationRunListener的contextPrepared()方法,通知所有的监听者:ApplicationContext已经准备完毕
将所有的bean加载到容器中
调用SpringApplicationRunListener的contextLoaded()方法,通知所有的监听者:ApplicationContext已经装载完毕

리프레시 용기 ApplicationContext를 갱신 () 메소드를 호출 7.

这里的刷新和spring中刷新原理类似,这里重点关注invokeBeanFactoryPostProcessors(beanFactory);方法,主要完成获取到所有的BeanFactoryPostProcessor来对容器做一些额外的操作,通过源可以进入到PostProcessorRegistrationDelegate类
的invokeBeanFactoryPostProcessors()方法,会获取类型为BeanDefinitionRegistryPostProcessor的beanorg.springframework.context.annotation.internalConfigurationAnnotationProcessor,对应的Class为ConfigurationClassPostProcessor。ConfigurationClassPostProcessor用于解析处理各种注解,包括:@Configuration、@ComponentScan、@Import、@PropertySource、@ImportResource、@Bean。当处理@import注解的时候,就会调用<自动配置>这一小节中的EnableAutoConfigurationImportSelector.selectImports()来完成自动配置功能

그들을 실행이 걸어 경우 등록 8. 이봐, CommandLineRunner 및 ApplicationRunner 현재 컨텍스트가 있습니다.

게시 23 개 원래 기사 · 원 찬양 2 · 조회수 929

추천

출처blog.csdn.net/metjoyful/article/details/103378367