소스에 의해로드 springboot의 application.properties의 과정을 이해

있는 application.properties 소스 springboot로드 프로세스 이해함으로써
원래 천재 작은 껍질이 2018년 9월 27일 16시 52분 31초에 게시 된 2494 컬렉션을 읽어
출시
springboot이 프로필 application.properties이를, 나는 단지 같은 구성 파일의 알고 있지만 springboot 활성화되면, 파일을로드하는 방법과이 파일을 찾을 수 있습니다 어디? 소스에서 볼 수

주요 방법의 방법 SpringApplication.run (Test.class라는, 인수)을 수행하는 단계;보기 소스 SpringApplication 클래스, 실행 방법에

공공 정적 ConfigurableApplicationContext 실행 (오브젝트 소스, 문자열 ... 인수) {
        반환 실행 (새로운 객체 [] {소스} 인수);
    }

재입국 실행 (새로운 객체 [] {소스} 인수) 방법

공공 정적 ConfigurableApplicationContext 실행 (객체 [] 소스는 문자열 []에 args) {
        새로운 SpringApplication (소스) .RUN (인수를) 반환;
    }

이 시점에서, 당신은 새로운 SpringApplication, 새로운 SpringApplication (소스)을 만들 살펴볼 수 있으며, 수행 () 메소드를 실행, 첫 번째 생성자는 그런 것들을 초기화를 무엇을보고, 취할

공공 SpringApplication (객체 ... 소스) {
        초기화 (소스);
    }

초기화 (소스)가, 방법은, 다음으로 이동

@SuppressWarnings ({ "체크", "rawtypes"})
    개인 무효 초기화 (개체 [] 소스) {
        경우 (소스! = NULL && sources.length> 0) {
            this.sources.addAll (Arrays.asList (소스)) ;
        }
        this.webEnvironment deduceWebEnvironment = ();
        setInitializers ((수집) getSpringFactoriesInstances (
                ApplicationContextInitializer.class));
        setListeners ((수집) getSpringFactoriesInstances (ApplicationListener.class));
        this.mainApplicationClass deduceMainApplicationClass = ();
    }

위의 코드에서, this.webEnvironment = deduceWebEnvironment ();이 방법은 주로 sevlet과 ConfigurableWebApplicationContext을 선별하고, 어떻게이 두는 false를 돌려, true, 그렇지, 어떤 특정 역할, 나도 몰라,하지만이 시간 관련이없는 문제는 소스 코드에서) (setInitalizers, 옆 모습을 방법을 넣어 일시적으로 논의

공공 무효 setInitializers (
            {? 컬렉션 <ApplicationContextInitializer <>> 이니셜 연장)
        this.initializers = 새의 ArrayList를 <ApplicationContextInitializer <>> ();
        this.initializers.addAll (초기화);
    }

이 방법은 구현 클래스가 ApplicationContextInitializer getSpringFactoriesInstances (설정 this.initializers 첨가
                얻어진 반사 형을 사용하여 구현 설정 ApplicationContextInitializer.class) 방법

개인 <T> 컬렉션 <? 연장 T> getSpringFactoriesInstances (클래스 <T> 타입,
            클래스 <> [] parameterTypes와 개체 ... 인수?) {
        클래스 로더는 Thread.currentThread classLoader가 = () getContextClassLoader ().;
        // 이름을 사용하고 중복을 방지하기 위해 고유의 보장
        설정 <문자열> 이름 = 새로운 LinkedHashSet의 <문자열> (
                SpringFactoriesLoader.loadFactoryNames (유형, classLoader가));
        목록 <T> = createSpringFactoriesInstances 인스턴스 (타입 parameterTypes와,
                classLoader가, 인수, 이름);
        AnnotationAwareOrderComparator.sort (인스턴스);
        인스턴스를 반환;
    }

부하로 구현 클래스에 springboot ApplicationContextInitializer에 this.initializers에 저장

[org.springframework.boot.context.config.DelegatingApplicationContextInitializer,

org.springframework.boot.context.ContextIdApplicationContextInitializer,

org.springframework.boot.context.ConfigurationWarningsApplicationContextInitializer,

org.springframework.boot.context.embedded.ServerPortInfoApplicationContextInitializer,

org.springframework.boot.autoconfigure.SharedMetadataReaderFactoryContextInitializer,

org.springframework.boot.autoconfigure.logging.AutoConfigurationReportLoggingInitializer]

방법에있어서, 상기 로딩 ApplicationContextInitializer 단계로서, 저장 this.listeners에서, 이러한 구현 클래스 무부하 application.properties 파일을 포함하지없이 일시적 모습 setListeners ((수집) getSpringFactoriesInstances (ApplicationListener.class)) 중 만약 ApplicationListener는 다음을해야합니다

[org.springframework.boot.context.config.ConfigFileApplicationListener,

org.springframework.boot.context.config.AnsiOutputApplicationListener,

org.springframework.boot.logging.LoggingApplicationListener,

org.springframework.boot.logging.ClasspathLoggingApplicationListener,

org.springframework.boot.autoconfigure.BackgroundPreinitializer,

org.springframework.boot.context.config.DelegatingApplicationListener,

org.springframework.boot.builder.ParentContextCloserApplicationListener,

org.springframework.boot.ClearCachesApplicationListener

org.springframework.boot.context.FileEncodingApplicationListener,

org.springframework.boot.liquibase.LiquibaseServiceLocatorApplicationListener]

여기에서 매우 중요한 리스너 ConfigFileApplicationListener를 볼 수 있습니다

공용 클래스 ConfigFileApplicationListener 구현 EnvironmentPostProcessor,
        만약 ApplicationListener <가 ApplicationEvent>, 순서가 {

    개인 정적 문자열 DEFAULT_PROPERTIES 최종 = "defaultProperties";

    // 순서는 이상에서 가장 구체적인 (마지막 승리)에 참고
    개인 정적 최종 문자열 DEFAULT_SEARCH_LOCATIONS = "/ 클래스 경로 : 클래스 경로 / 설정 / 파일 : ./, 파일 : ./ 설정 /"; //默认加载的位置

    개인 정적 최종 문자열 DEFAULT_NAMES = "응용 프로그램"; // 기본 프로필 이름

    / **
     * "활성 프로파일"프로퍼티 명입니다.
     * /
    공공 정적 최종 문자열 ACTIVE_PROFILES_PROPERTY = "spring.profiles.active";

    / **
     * 분실물 이름 "프로파일을 포함한다."
     * /
    공공 정적 최종 문자열 INCLUDE_PROFILES_PROPERTY = "spring.profiles.include";

    / **
     *은 "설정 이름"프로퍼티 명입니다.
     * /
    공공 정적 최종 문자열 CONFIG_NAME_PROPERTY = "spring.config.name";

    / **
     *은 "설정 위치"프로퍼티 명입니다.
     * /
    공공 정적 최종 문자열 CONFIG_LOCATION_PROPERTY = "spring.config.location";

    / **
     * 프로세서의 기본 순서.
     * /
    공공 정적 최종 INT의 DEFAULT_ORDER Ordered.HIGHEST_PRECEDENCE = + 10;

    / **
     * 응용 프로그램 구성의 이름 {@link PropertySource}.
     * /
    공공 정적 문자열 APPLICATION_CONFIGURATION_PROPERTY_SOURCE_NAME = "applicationConfigurationProperties"최종;

    개인 최종 DeferredLog 로거 새로운 DeferredLog을 () =;

    개인 문자열 searchLocations;

    개인 문자열 이름;

    개인 INT 순서 = DEFAULT_ORDER;

    개인 최종 ConversionService conversionService = 새로운 DefaultConversionService ();

    @Override
    공공 무효 onApplicationEvent (가 ApplicationEvent 이벤트) {
       .....................................
    }
.......... ......

}

여기서 최종적으로로드 application.properties 클래스를 발견하고, 각각의 클래스는 prependProfile () 메소드 해상도 구성에 application.properties 속성 값을 해결한다.

위, SpringApplication하지만 클래스의 컬렉션이는 다음 모니터에 어디를

여기에서 살펴 수있는 run () 메소드를 입력

공공 ConfigurableApplicationContext 실행 (문자열 ... 인수) {
        // ...........
        SpringApplicationRunListeners 리스너 = getRunListeners (인수);
        () listeners.starting;

      // ...................

}

여기서, 구현 클래스가 SpringApplicationRunListeners EventPublishingRunListener 수득하고, 그 다음에 EventPublishingRunListener 모니터 온 상태는 다음 과정을 만들어

공개 EventPublishingRunListener (SpringApplication 애플리케이션 문자열 []에 args) {
        this.application = 어플리케이션;
        this.args = 인수;
        this.initialMulticaster 새로운 SimpleApplicationEventMulticaster을 () =;
        대 (만약 ApplicationListener 리스너 <?> application.getListeners ()) {
            this.initialMulticaster.addApplicationListener (수신기);
        }
    }

생성자에서 EventPublishingRunListener의, application.getListeners ()가 수신기에 저장 SpringApplication의 this.listeners의 모음 모양 listeners.starting 획득 (); 어떤 방법 할 일

공공 무효 시작 () {
        (SpringApplicationRunListener 리스너 : this.listeners)가 {
            ) (listener.starting;
        }
    }

그것은 모든 청취자의 컬렉션 모니터를 연 것입니다.이 최종 application.properties를로드합니다.

요약 :

EventPublishingRunListener 개방에 의해 실행 실행에, 생성자 SpringApplication 클래스로드 리스너 필요성을 springboot () 메소드는 모든 청취하는
청취자입니다. ----------------
저작권 : 이 문서 CSDN 블로거 원래 기사 "천재 작은 껍질"및 후속의 CC 4.0 BY-SA 저작권 계약, 원본 소스 링크이 문을 첨부 해주세요 재현.
원본 링크 : HTTPS : //blog.csdn.net/qq_36009027/article/details/82868431

추천

출처www.cnblogs.com/zhoading/p/12167462.html