springboot学びます
springboot開始原理
SpringBoot全体起動プロセスは、2つのステップに分けられる: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.作成および構成環境現在のアプリケーションが使用され、環境は二つの側面を抽象化し、現在の動作環境、アプリケーションの記述するために使用:設定ファイル(プロファイル)と属性(プロパティ)、異なる環境(例:生産プロパティは、構成ファイル、環境変数、コマンドラインパラメータの供給源から得ることができるが、環境、プレリリース環境)は、異なるプロファイルを使用することができます。環境は、アプリケーション全体でいつでも準備ができたときにそのため、あなたは環境からリソースを取得することができます。
- 環境存在するかどうかを判断し、(Webプロジェクトを作成した場合- - -存在しません作成
StandardServletEnvironment、またはStandardEnvironmentを作成します)- 構成環境:構成プロファイルとプロパティ
- environmentPreparedのコールSpringApplicationRunListener()メソッドは、通知イベントリスナー:環境のアプリケーションは準備ができています
3.(カスタマイズすることができます)バナーを印刷し
、別のApplicationContextのコンテナを作成するために、Webプロジェクトであるかどうかに応じて
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現在のコンテキストを持っています。