いくつかの重要なイベントのコールバックメカニズム:
1 に配置され、META-INF / spring.factories
ApplicationContextInitializer
SpringApplicationRunlistener
図2は、配置する必要がIOCのコンテナ
3 、ApplicationRunner
4 、CommandLineRunner
まず、作成 SpringApplicationのオブジェクトを
迅速で、プロジェクトを作成し SpringBootApplicationの、クラスのメインのエントリークラスとしてメソッドRUN マークされたブレークポイント()メソッド、デバッグ実行を、
公共SpringApplication(ResourceLoader resourceLoader、クラス<?> ... primarySources){
// マスター構成クラスを保存
this.resourceLoader = resourceLoader。
Assert.notNull(primarySources、 "PrimarySourcesがnullであってはなりません")。
this.primarySources =新しいLinkedHashSetの<>(は、Arrays.asList(primarySources));
// 現在のかどうかを判断するのWeb アプリケーション
this.webApplicationType = WebApplicationType.deduceFromClasspath()。
// クラスのシステムからのパスを見つけるMETA-INF / spring.factories 設定されたすべてのApplicationContextInitializerを、それを保存
setInitializers((コレクション)getSpringFactoriesInstances(ApplicationContextInitializer.class));
// クラスのシステムからのパスを見つけるMETA-INFを/ spring.factories すべての設定をApplicationListener
setListeners((コレクション)getSpringFactoriesInstances(ApplicationListener.class));
//はから複数のクラスが配置されている見つける主マスター構成クラスのメソッド
this.mainApplicationClass = deduceMainApplicationClass()。
}
第二に、実行し、実行方法
当時続けました:
公共ConfigurableApplicationContextラン(文字列...引数){
ストップウォッチストップウォッチ=新しいストップウォッチ();
stopWatch.start();
ConfigurableApplicationContextコンテキスト= NULL;
コレクション<SpringBootExceptionReporter> exceptionReporters =新しいArrayListを<>();
configureHeadlessProperty();
// 取得SpringApplicationRunListenersをクラスパスから、メッタ-INF / spring.factories
SpringApplicationRunListenersリスナー= getRunListeners(引数)。
// コールバックすべてのSpringApplicationRunListeners.starting 方法
listeners.starting();
{試します
// コマンドラインパラメータをパッケージ化
ApplicationArguments applicationArguments =新しいDefaultApplicationArguments(引数);
// 環境を準備
ConfigurableEnvironment環境= prepareEnvironment(リスナー、applicationArguments)。
// 完了コールバックが後に環境を作るSpringApplicationRunListeners.environmentPrepared)(; 周囲の準備ができています
configureIgnoreBeanInfo(環境)。
バナー= printedBanner印刷バナー(環境)。
// 作成ApplicationContextの作成することを決めた、ウェブのIOC または通常のIOCを
コンテキスト= createApplicationContext()。
exceptionReporters = getSpringFactoriesInstances(SpringBootExceptionReporter.class、
新しいクラス[] {ConfigurableApplicationContext.class}、コンテキスト)。
// ;コンテキストを準備環境がために保存されているIOC に、そしてapplyInitializers ()
applyInitializers //() :すべての以前に保存されたコールバックApplicationContextInitializer 初期化方法
// コールバックすべてSpringApplicationRunListeners.contextPrepared ()
prepareContext(コンテキスト、環境、リスナー、applicationArguments、printedBanner)。
// prepareContextのすべてのコールバック完了後に実行SpringApplicationRunListeners のcontextLoaded ()
// リフレッシュ容器と、IOCのコンテナの初期化(場合のWeb アプリケーションが埋め込ま作成するTomcatを); 春のコメント
// 、スキャン、作成負荷がすべてのコンポーネントを配置します。(設定クラス、コンポーネント、自動設定)
refreshContext(コンテキスト)。
// から、IOCはすべてのコンテナを取得ApplicationRunner とCommandLineRunner コールバック
// ApplicationRunner 最初のコールバック、CommandLineRunner 再びコールバック
afterRefresh(コンテキスト、applicationArguments)。
stopWatch.stop();
IF(this.logStartupInfo){
新しいStartupInfoLogger(this.mainApplicationClass).logStarted(getApplicationLog()、ストップウォッチ);
}
(コンテキスト)listeners.started。
callRunners(コンテキスト、applicationArguments)。
}
キャッチ(ThrowableのEX){
handleRunFailure(コンテキスト、EX、exceptionReporters、リスナー)。
新しいIllegalStateExceptionを(EX)を投げます。
}
{試します
listeners.running(コンテキスト)。
}
キャッチ(ThrowableのEX){
handleRunFailure(コンテキスト、EX、exceptionReporters、NULL);
新しいIllegalStateExceptionを(EX)を投げます。
}
// 全体SpringBootのアプリケーションの起動が完了している外国為替リベートリターンの開始後にIOCのコンテナ
コンテキストを返します。
} 第三に、イベントリスナー機構
作成するために、いくつかのメカニズムの上にモニターの電源を入れ、
HelloApplicationContextInitializer :
パブリッククラスHelloApplicationContextInitializer実装ApplicationContextInitializer <ConfigurableApplicationContext> {
@オーバーライド
公共のボイドのinitialize(ConfigurableApplicationContextのApplicationContext){
System.out.println( "ApplicationContextInitializer ...初期化..." +のApplicationContext)。
}
}
HelloSpringApplicationRunListener :
パブリッククラスHelloSpringApplicationRunListener実装SpringApplicationRunListener {
公共HelloSpringApplicationRunListener(SpringApplicationアプリケーション、文字列[]引数){
}
@オーバーライド
公共ボイド開始(){
System.out.println( "SpringApplicationRunListener ...始まります...");
}
@オーバーライド
公共のボイドenvironmentPrepared(ConfigurableEnvironment環境){
= environment.getSystemProperties Oオブジェクト()( "os.name")を取得します。
System.out.println( "SpringApplicationRunListener ...環境" + O)。
}
@オーバーライド
公共ボイドcontextPrepared(ConfigurableApplicationContextコンテキスト){
System.out.println( "SpringApplicationRunListener ... contextPrepared");
}
@オーバーライド
公共ボイドcontextLoaded(ConfigurableApplicationContextコンテキスト){
System.out.println( "SpringApplicationRunListener ... contextLoaded");
}
@オーバーライド
公共のボイド開始(ConfigurableApplicationContextコンテキスト){
System.out.println( "SpringApplicationRunListener ...開始");
}
@オーバーライド
公共のボイドランニング(ConfigurableApplicationContextコンテキスト){
System.out.println( "SpringApplicationRunListener ...実行しています");
}
@オーバーライド
公共ボイド失敗(ConfigurableApplicationContextコンテキストのThrowable例外){
System.out.println( "SpringApplicationRunListener ...失敗");
}
}
HelloApplicationRunner :
@成分
パブリッククラスHelloAppicationRunner実装ApplicationRunner {
@オーバーライド
ます。public void実行(ApplicationArgumentsのargsが){例外がスローされます
System.out.println( "ApplicationRunner ...ラン..");
}
}
HelloCommandLineRuinner :
@成分
パブリッククラスHelloCommandLineRunner実装CommandLineRunner {
@オーバーライド
ます。public void実行(文字列... argsが){例外がスローされます
System.out.println( "CommandLineRunner ...ラン..." +は、Arrays.asList());
}
}
前述の ApplicationContextInitializer とSpringApplicationRunlistener 必要性の設定、内の位置に配置されているMETA-INF / spring.factories ので作成し、META-INFのフォルダーを作成spring.factoriesの、ファイルを
org.springframework.context.ApplicationContextInitializer = \
com.itlaoqi.springbootspringbootapplication.listener.HelloApplicationContextInitializer
org.springframework.context.SpringApplicationRunListener = \
com.itlaoqi.springbootspringbootapplication.listener.HelloSpringApplicationRunListener
設定が完了した後にテストすることができるプロジェクトを開始します。
オリジナルリンク: https://blog.csdn.net/cyl101816/article/details/103582373