、SpringApplication(<?> ResourceLoader、クラス...)分析:
公共 SpringApplication(ResourceLoader ResourceLoader、クラス<?> ... primarySources){ // ResourceLoaderデフォルトでは空(null)の この .resourceLoader = ResourceLoader; // 引数mainメソッドの引数に、受信したコマンドラインを起動したときにパラメータを追加することができ 、これを = .primarySources 新しい新しい LinkedHashSetの<> (は、Arrays.asList(primarySources)); // 1クラスパスのクラスに応じて、対応するコンテナ型スプリングがあるか否かを判断 この .webApplicationType = WebApplicationType.deduceFromClasspath(); // 2.クラスローディングApplicationContextInitializerを初期化は setInitializers((コレクション)getSpringFactoriesInstances( ApplicationContextInitializer。クラス)); // 3. ApplicationListenerローディングリスナー setListeners((コレクション)getSpringFactoriesInstances(ApplicationListener。クラス)); // 4.メインクラスを推定する方法ここで この .mainApplicationClass = deduceMainApplicationClass(); }
1.1を決定Springコンテナタイプ
静的WebApplicationTypeのdeduceFromClasspath(){ // 1.确定反応容器类型 場合(ClassUtils.isPresent(WEBFLUX_INDICATOR_CLASS、ヌル) &&!ClassUtils.isPresent(WEBMVC_INDICATOR_CLASS、ヌル) &&!ClassUtils.isPresent(JERSEY_INDICATOR_CLASS、ヌル)){ 返すWebApplicationType.REACTIVE ; } // 2.确定なし容器类型 ための(文字列クラス名:SERVLET_INDICATOR_CLASSES){ 場合(!ClassUtils.isPresent(クラス名、ヌル)){ リターン WebApplicationType.NONE。 } } // 3.デフォルトのサーブレットコンテナ型の 戻りWebApplicationType.SERVLET; }
分析:
- org.springframework.web.reactive.DispatcherHandlerをロードし、ロードすることができず、org.springframework.web.servlet.DispatcherServlet org.glassfish.jersey.servlet.ServletContainerかどうかを決定する、それはこのコンテナ型WebApplicationType.REACTIVEと判定されました
- javax.servlet.Servlet org.springframework.web.context.ConfigurableWebApplicationContextをロードされていない場合決意、そして、それが判断され、このコンテナ型WebApplicationType.NONE
- 無フロント負荷の場合、デフォルトとしてコンテナ型WebApplicationType.SERVLET
1.2クラスのロードを初期化ApplicationContextInitializer
公共 のボイドsetInitializers(コレクション?< 拡張?ApplicationContextInitializer <>> 初期化子){ この .initializers = 新しい ArrayListを<> (); // 添加ApplicationContextInitializer类 この.initializers.addAll(初期化子)。 }
分析:
SpringFactoriesLoader.loadFactoryNames(タイプ、クラスローダ)ClassUtils.forName(名前、クラスローダに)ロードされたクラスオブジェクトを使用して、クラス名をロードし、そしてBeanUtils.instantiateClass(コンストラクタ、引数)を使用してコンストラクタ工法を取得することによって(AnnotationAwareOrderComparator.sortを使用してオブジェクトをインスタンス化しますソートするインスタンス)、
彼らは以下のとおりです。
- ConfigurationWarningsApplicationContextInitializer
- ContextIdApplicationContextInitializer
- ConditionEvaluationReportLoggingListener
- SharedMetadataReaderFactoryContextInitializer
- ServerPortInfoApplicationContextInitializer
- DelegatingApplicationContextInitializer
1.3 負荷ApplicationListenerリスナー
公共 のボイド setListeners(?コレクション< 拡張?ApplicationListener <>> リスナーを){ この .listeners = 新しい ArrayListを<> (); // 添加ApplicationListener类 この.listeners.addAll(リスナー)。 }
分析:
SpringFactoriesLoader.loadFactoryNames(タイプ、クラスローダ)ClassUtils.forName(名前、クラスローダに)ロードされたクラスオブジェクトを使用して、クラス名をロードし、そしてBeanUtils.instantiateClass(コンストラクタ、引数)を使用してコンストラクタ工法を取得することによって(AnnotationAwareOrderComparator.sortを使用してオブジェクトをインスタンス化しますソートするインスタンス)、
彼らは以下のとおりです。
- BackgroundPreinitializer
- ClearCachesApplicationListener
- ParentContextCloserApplicationListener
- FileEncodingApplicationListener
- AnsiOutputApplicationListener
- ConfigFileApplicationListener
- DelegatingApplicationListener
- ClasspathLoggingApplicationListener
- LoggingApplicationListener
- LiquibaseServiceLocatorApplicationListener
1.4 mainメソッドクラスを返します
プライベート <?>クラスdeduceMainApplicationClass(){ 試み{ のStackTraceElement []スタックトレースはの = 新しい新しいのRuntimeException()getStackTraceメソッドは();. // ミアンと呼ばれている方法を見つけるために、スタック情報、情報が実行されたすべてのスタックを反復処理、およびクラスを返します。情報 のため(のStackTraceElementののStackTraceElement:スタックトレース){ IF( "メイン" .equals(stackTraceElement.getMethodName())){ 戻りにClass.forName(stackTraceElement.getClassName()); } } } キャッチ(ClassNotFoundExceptionがEX){ // スワローと続けます } 戻り ヌル。 }
分析:
スタック方式を対応するクラス情報を取得横断現在のスレッドにより取得された異常なスタック情報は、主と呼ばれます
注:クラスの上記の読み取りパス名がロードされます/META-INF/spring.factories