spring boot容器起動フロー
はじめに
spring cloudが大道を歩む今、基本原理を知らないと葛藤しています。どうしてこのようにしますか?spring cloudはspring bootに基づいて快速に構築されています。今日はspring bootの容器起動の流れを見ます。本文はどのように速くspring bootを起動するかを説明しないで、あれらは直接公式的に見ればいいです。公式文書飛行機のチケット)
二、容器起動
spring bootは通常、指定された容器からmainメソッドを起動し、コマンドラインでJarパケットを起動します。
1.@Spring BootApple ation注釈
2.SprigAplication.run()静的方法
私たちはこの二つの内容をそれぞれ探究します。
2.1@Spring BootAppleコメント
ソースは以下の通りです
@Spring BootConfigration(実際には@Configration):JavaConfigの構成クラスであることを示しています。このクラスでbeanをカスタマイズできます。依存関係など。これはスプリングブック特有の注釈で、よく使われています。
@EnbleAutoConfigration:@Importの助けを借りて、自動構成条件に合致する全てのbean定義をIoC容器にロードする(ルートルートルートの下に置くと、サブパッケージとクラスをスキャンすることができると提案する)。これは詳細な掘り下げが必要です。
@ComponentScan:springの自動スキャンコメントは、スキャン範囲を定義し、IOC容器にロードすることができます。-」これは多くなくて、springの注釈はみんなはきっと見覚えがあります。
その中@EnbaleAutoConfigrationという注釈のソースコード:
コア方法はトップインターフェースImportSelectorのselectImports()で、ソースは以下の通りです。
1)loadMetadataロードプロファイル
実際には、クラス加載器でロードします。META-INF/spring-autconfigre-metadata.properties(spring-boot-aut configre-1.5.RELEAS-sources.jar)ファイルで定義されている配置は、Propties AutoConfiglationMetadataに戻ります。
2)getsCadidateConfigrationsは、デフォルトサポートの自動プロファイルリストを取得します。
霊魂の自動配置方法は、Spring FactoresLoader.loadFactoryNamesが、META-INF/spring.factores(spring-atoconfigre-1.5.RELEAS-sources.jar)ファイルから自動配置タイプkey=EnbaleAutoConfigrations.classの構成を取得する。
SpringApple.run
実際にはSprigAplication RunListener類です。
現在のクラスのキャリアはMETA-INF/spring.factoresファイルからSpringAplication RunListener類の配置を取得します。
1.2スプリング工場の作成例(createSprigFactoricInstance)
第1ステップで得られたSet<String>names(SpringAppliation RunListenerの唯一の実現クラスEventPublishingRunListener)に従って、「イベントリリース起動モニター」の工場例を生成する。
spring bootが提供する2つのユーザーが自分で開拓するインターフェース:Application RunnerとCommand Liner。コンテナ起動後(コンテキストリフレッシュ後)に実行し、同様のデータ初期化を行うことができます。
三、まとめ
前の分析によれば、Spring-boot容器起動プロセスは全体的に2つの部分に分けられます。
1)注を実行する:指定範囲のbeanをスキャンし、自動配置類に対応するbeanを読み込み、IOC容器にロードする。
2)マンメソッドの具体的なSpringApplitions.run()は、全流れがSprigAplication Eventを貫いています。6つのサブクラスがあります。
クラス図は以下の通りです
上記のように、古典的なspringイベント駆動モデルであり、3つのキャラクターが含まれています。イベントリリース者、イベント、傍受者です。spring-bootに対応しています。
1.Event PublishingRunListenerという種類のパッケージがイベントリリースされました。
2.SprigAplication Eventは、spring-bootで定義されているイベント(上に述べた6つのイベント)であり、Application Event(springで定義されている)から引き継ぎます。
3.前記6つのイベントに対するモニターを実施していません。ここではユーザが自分でリスナー(上記6つのイベント)を実現して、スプリングブック容器の起動プロセスを注入し、該当イベントをトリガします。
例えば、Appliation Listener<Application ReadyEvent>というインターフェースを実現し、容器起動が完了した時に最後のステップlistener.finishedを実行する場合、起動に異常がなければ実行します。データ初期化などの操作ができます。
締め括りをつける
以上は小编が皆さんに绍介したspring boot容器の起动に関する知识です。皆さんに助けてほしいです。もし何か疑问があれば、メッセージをください。小编はすぐに皆さんに返事します。ここでも私たちのサイトを応援してくれてありがとうございます。
spring cloudが大道を歩む今、基本原理を知らないと葛藤しています。どうしてこのようにしますか?spring cloudはspring bootに基づいて快速に構築されています。今日はspring bootの容器起動の流れを見ます。本文はどのように速くspring bootを起動するかを説明しないで、あれらは直接公式的に見ればいいです。公式文書飛行機のチケット)
二、容器起動
spring bootは通常、指定された容器からmainメソッドを起動し、コマンドラインでJarパケットを起動します。
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
ここの核心は2つのものに注目します。1.@Spring BootApple ation注釈
2.SprigAplication.run()静的方法
私たちはこの二つの内容をそれぞれ探究します。
2.1@Spring BootAppleコメント
ソースは以下の通りです
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = {
@Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
コアコメント:@Spring BootConfigration(実際には@Configration):JavaConfigの構成クラスであることを示しています。このクラスでbeanをカスタマイズできます。依存関係など。これはスプリングブック特有の注釈で、よく使われています。
@EnbleAutoConfigration:@Importの助けを借りて、自動構成条件に合致する全てのbean定義をIoC容器にロードする(ルートルートルートの下に置くと、サブパッケージとクラスをスキャンすることができると提案する)。これは詳細な掘り下げが必要です。
@ComponentScan:springの自動スキャンコメントは、スキャン範囲を定義し、IOC容器にロードすることができます。-」これは多くなくて、springの注釈はみんなはきっと見覚えがあります。
その中@EnbaleAutoConfigrationという注釈のソースコード:
@SuppressWarnings("deprecation")
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(EnableAutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
コアはEnbaleAutoConfigrationImportSelectorの種類図です。コア方法はトップインターフェースImportSelectorのselectImports()で、ソースは以下の通りです。
@Override
public String[] selectImports(AnnotationMetadata annotationMetadata) {
if (!isEnabled(annotationMetadata)) {
return NO_IMPORTS;
}
try { //1. META-INF/spring-autoconfigure-metadata.properties 483 ( ),
AutoConfigurationMetadata autoConfigurationMetadata = AutoConfigurationMetadataLoader
.loadMetadata(this.beanClassLoader);
AnnotationAttributes attributes = getAttributes(annotationMetadata);//2.
List<String> configurations = getCandidateConfigurations(annotationMetadata,//3. 97
attributes);
configurations = removeDuplicates(configurations);//4.
configurations = sort(configurations, autoConfigurationMetadata);//5.
Set<String> exclusions = getExclusions(annotationMetadata, attributes);//6.
checkExcludedClasses(configurations, exclusions);//7.
configurations.removeAll(exclusions);//8.
configurations = filter(configurations, autoConfigurationMetadata);//9. OnClassCondition( )
fireAutoConfigurationImportEvents(configurations, exclusions);//10.
return configurations.toArray(new String[configurations.size()]);
}
catch (IOException ex) {
throw new IllegalStateException(ex);
}
}
ここでは3つの核心方法に注意します。1)loadMetadataロードプロファイル
実際には、クラス加載器でロードします。META-INF/spring-autconfigre-metadata.properties(spring-boot-aut configre-1.5.RELEAS-sources.jar)ファイルで定義されている配置は、Propties AutoConfiglationMetadataに戻ります。
2)getsCadidateConfigrationsは、デフォルトサポートの自動プロファイルリストを取得します。
霊魂の自動配置方法は、Spring FactoresLoader.loadFactoryNamesが、META-INF/spring.factores(spring-atoconfigre-1.5.RELEAS-sources.jar)ファイルから自動配置タイプkey=EnbaleAutoConfigrations.classの構成を取得する。
protected List<String> getCandidateConfigurations(AnnotationMetadata metadata,
AnnotationAttributes attributes) {// 2 ... ...
List<String> configurations = SpringFactoriesLoader.loadFactoryNames(
getSpringFactoriesLoaderFactoryClass(), getBeanClassLoader());
Assert.notEmpty(configurations,
"No auto configuration classes found in META-INF/spring.factories. If you "
+ "are using a custom packaging, make sure that file is correct.");
return configurations;
}
// EnableAutoConfiguration
protected Class<?> getSpringFactoriesLoaderFactoryClass() {
return EnableAutoConfiguration.class;
}
実際に何を得ましたか?spring.factoresファイルは以下の通りです。実際に〹Auto Configre自動配置モジュールのすべての種類を取得しました。
# Initializers
org.springframework.context.ApplicationContextInitializer=\
org.springframework.boot.autoconfigure.SharedMetadataReaderFactoryContextInitializer,\
org.springframework.boot.autoconfigure.logging.AutoConfigurationReportLoggingInitializer
# Application Listeners
org.springframework.context.ApplicationListener=\
org.springframework.boot.autoconfigure.BackgroundPreinitializer
# Auto Configuration Import Listeners
org.springframework.boot.autoconfigure.AutoConfigurationImportListener=\
org.springframework.boot.autoconfigure.condition.ConditionEvaluationReportAutoConfigurationImportListener
# Auto Configuration Import Filters
org.springframework.boot.autoconfigure.AutoConfigurationImportFilter=\
org.springframework.boot.autoconfigure.condition.OnClassCondition
# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\
org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\
org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration,\
org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration,\
org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration,\
org.springframework.boot.autoconfigure.cloud.CloudAutoConfiguration,\
org.springframework.boot.autoconfigure.context.ConfigurationPropertiesAutoConfiguration,\
org.springframework.boot.autoconfigure.context.MessageSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration,\
org.springframework.boot.autoconfigure.couchbase.CouchbaseAutoConfiguration,\
org.springframework.boot.autoconfigure.dao.PersistenceExceptionTranslationAutoConfiguration,\
org.springframework.boot.autoconfigure.data.cassandra.CassandraDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.cassandra.CassandraRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.couchbase.CouchbaseDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.couchbase.CouchbaseRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchAutoConfiguration,\
org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.ldap.LdapDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.ldap.LdapRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.mongo.MongoRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.neo4j.Neo4jDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.neo4j.Neo4jRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.solr.SolrRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration,\
org.springframework.boot.autoconfigure.data.redis.RedisRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.rest.RepositoryRestMvcAutoConfiguration,\
org.springframework.boot.autoconfigure.data.web.SpringDataWebAutoConfiguration,\
org.springframework.boot.autoconfigure.elasticsearch.jest.JestAutoConfiguration,\
org.springframework.boot.autoconfigure.freemarker.FreeMarkerAutoConfiguration,\
org.springframework.boot.autoconfigure.gson.GsonAutoConfiguration,\
org.springframework.boot.autoconfigure.h2.H2ConsoleAutoConfiguration,\
org.springframework.boot.autoconfigure.hateoas.HypermediaAutoConfiguration,\
org.springframework.boot.autoconfigure.hazelcast.HazelcastAutoConfiguration,\
org.springframework.boot.autoconfigure.hazelcast.HazelcastJpaDependencyAutoConfiguration,\
org.springframework.boot.autoconfigure.info.ProjectInfoAutoConfiguration,\
org.springframework.boot.autoconfigure.integration.IntegrationAutoConfiguration,\
org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.JndiDataSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.XADataSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration,\
org.springframework.boot.autoconfigure.jms.JmsAutoConfiguration,\
org.springframework.boot.autoconfigure.jmx.JmxAutoConfiguration,\
org.springframework.boot.autoconfigure.jms.JndiConnectionFactoryAutoConfiguration,\
org.springframework.boot.autoconfigure.jms.activemq.ActiveMQAutoConfiguration,\
org.springframework.boot.autoconfigure.jms.artemis.ArtemisAutoConfiguration,\
org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration,\
org.springframework.boot.autoconfigure.groovy.template.GroovyTemplateAutoConfiguration,\
org.springframework.boot.autoconfigure.jersey.JerseyAutoConfiguration,\
org.springframework.boot.autoconfigure.jooq.JooqAutoConfiguration,\
org.springframework.boot.autoconfigure.kafka.KafkaAutoConfiguration,\
org.springframework.boot.autoconfigure.ldap.embedded.EmbeddedLdapAutoConfiguration,\
org.springframework.boot.autoconfigure.ldap.LdapAutoConfiguration,\
org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration,\
org.springframework.boot.autoconfigure.mail.MailSenderAutoConfiguration,\
org.springframework.boot.autoconfigure.mail.MailSenderValidatorAutoConfiguration,\
org.springframework.boot.autoconfigure.mobile.DeviceResolverAutoConfiguration,\
org.springframework.boot.autoconfigure.mobile.DeviceDelegatingViewResolverAutoConfiguration,\
org.springframework.boot.autoconfigure.mobile.SitePreferenceAutoConfiguration,\
org.springframework.boot.autoconfigure.mongo.embedded.EmbeddedMongoAutoConfiguration,\
org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration,\
org.springframework.boot.autoconfigure.mustache.MustacheAutoConfiguration,\
org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration,\
org.springframework.boot.autoconfigure.reactor.ReactorAutoConfiguration,\
org.springframework.boot.autoconfigure.security.SecurityAutoConfiguration,\
org.springframework.boot.autoconfigure.security.SecurityFilterAutoConfiguration,\
org.springframework.boot.autoconfigure.security.FallbackWebSecurityAutoConfiguration,\
org.springframework.boot.autoconfigure.security.oauth2.OAuth2AutoConfiguration,\
org.springframework.boot.autoconfigure.sendgrid.SendGridAutoConfiguration,\
org.springframework.boot.autoconfigure.session.SessionAutoConfiguration,\
org.springframework.boot.autoconfigure.social.SocialWebAutoConfiguration,\
org.springframework.boot.autoconfigure.social.FacebookAutoConfiguration,\
org.springframework.boot.autoconfigure.social.LinkedInAutoConfiguration,\
org.springframework.boot.autoconfigure.social.TwitterAutoConfiguration,\
org.springframework.boot.autoconfigure.solr.SolrAutoConfiguration,\
org.springframework.boot.autoconfigure.thymeleaf.ThymeleafAutoConfiguration,\
org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration,\
org.springframework.boot.autoconfigure.transaction.jta.JtaAutoConfiguration,\
org.springframework.boot.autoconfigure.validation.ValidationAutoConfiguration,\
org.springframework.boot.autoconfigure.web.DispatcherServletAutoConfiguration,\
org.springframework.boot.autoconfigure.web.EmbeddedServletContainerAutoConfiguration,\
org.springframework.boot.autoconfigure.web.ErrorMvcAutoConfiguration,\
org.springframework.boot.autoconfigure.web.HttpEncodingAutoConfiguration,\
org.springframework.boot.autoconfigure.web.HttpMessageConvertersAutoConfiguration,\
org.springframework.boot.autoconfigure.web.MultipartAutoConfiguration,\
org.springframework.boot.autoconfigure.web.ServerPropertiesAutoConfiguration,\
org.springframework.boot.autoconfigure.web.WebClientAutoConfiguration,\
org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration,\
org.springframework.boot.autoconfigure.websocket.WebSocketAutoConfiguration,\
org.springframework.boot.autoconfigure.websocket.WebSocketMessagingAutoConfiguration,\
org.springframework.boot.autoconfigure.webservices.WebServicesAutoConfiguration
# Failure analyzers
org.springframework.boot.diagnostics.FailureAnalyzer=\
org.springframework.boot.autoconfigure.diagnostics.analyzer.NoSuchBeanDefinitionFailureAnalyzer,\
org.springframework.boot.autoconfigure.jdbc.DataSourceBeanCreationFailureAnalyzer,\
org.springframework.boot.autoconfigure.jdbc.HikariDriverConfigurationFailureAnalyzer
# Template availability providers
org.springframework.boot.autoconfigure.template.TemplateAvailabilityProvider=\
org.springframework.boot.autoconfigure.freemarker.FreeMarkerTemplateAvailabilityProvider,\
org.springframework.boot.autoconfigure.mustache.MustacheTemplateAvailabilityProvider,\
org.springframework.boot.autoconfigure.groovy.template.GroovyTemplateAvailabilityProvider,\
org.springframework.boot.autoconfigure.thymeleaf.ThymeleafTemplateAvailabilityProvider,\
org.springframework.boot.autoconfigure.web.JspTemplateAvailabilityProvider
3)filterフィルタはOnClass Coditionによって条件を満たさないものをフィルタします。
private List<String> filter(List<String> configurations,
AutoConfigurationMetadata autoConfigurationMetadata) {
long startTime = System.nanoTime();
String[] candidates = configurations.toArray(new String[configurations.size()]);
boolean[] skip = new boolean[candidates.length];
boolean skipped = false;
// ,spring.factories :org.springframework.boot.autoconfigure.condition.OnClassCondition
for (AutoConfigurationImportFilter filter : getAutoConfigurationImportFilters()) {
invokeAwareMethods(filter);
boolean[] match = filter.match(candidates, autoConfigurationMetadata);
for (int i = 0; i < match.length; i++) {
if (!match[i]) {
skip[i] = true;
skipped = true;
}
}
}
if (!skipped) {// ->skipped = true, -》skipped = false->
return configurations;
}
List<String> result = new ArrayList<String>(candidates.length);
for (int i = 0; i < candidates.length; i++) {
if (!skip[i]) {// -》 -》 result
result.add(candidates[i]);
}
}
if (logger.isTraceEnabled()) {
int numberFiltered = configurations.size() - result.size();
logger.trace("Filtered " + numberFiltered + " auto configuration class in "
+ TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - startTime)
+ " ms");
}
return new ArrayList<String>(result);
}
2.2 SprigAplication.run()静的方法SpringApple.run
public ConfigurableApplicationContext run(String... args) {
StopWatch stopWatch = new StopWatch();
stopWatch.start();
ConfigurableApplicationContext context = null;
FailureAnalyzers analyzers = null;
configureHeadlessProperty();
SpringApplicationRunListeners listeners = getRunListeners(args);//1.
listeners.starting();--> !
try {
ApplicationArguments applicationArguments = new DefaultApplicationArguments(
args);
ConfigurableEnvironment environment = prepareEnvironment(listeners,//2. , ApplicationEnvironmentPreparedEvent
applicationArguments);
Banner printedBanner = printBanner(environment);// , spring
context = createApplicationContext();//
analyzers = new FailureAnalyzers(context);
prepareContext(context, environment, listeners, applicationArguments,//3.
printedBanner);
refreshContext(context);//4.
afterRefresh(context, applicationArguments);//5.
listeners.finished(context, null);-- !
stopWatch.stop();
if (this.logStartupInfo) {
new StartupInfoLogger(this.mainApplicationClass)
.logStarted(getApplicationLog(), stopWatch);
}
return context;
}
catch (Throwable ex) {
handleRunFailure(context, listeners, analyzers, ex);
throw new IllegalStateException(ex);
}
}
1.getRunListenersはモニターを取得します。実際にはSprigAplication RunListener類です。
private SpringApplicationRunListeners getRunListeners(String[] args) {
Class<?>[] types = new Class<?>[] { SpringApplication.class, String[].class };
return new SpringApplicationRunListeners(logger, getSpringFactoriesInstances(
SpringApplicationRunListener.class, types, this, args));
}
private <T> Collection<? extends T> getSpringFactoriesInstances(Class<T> type) {
return getSpringFactoriesInstances(type, new Class<?>[] {});
}
private <T> Collection<? extends T> getSpringFactoriesInstances(Class<T> type,
Class<?>[] parameterTypes, Object... args) {
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
// Set
Set<String> names = new LinkedHashSet<String>(
SpringFactoriesLoader.loadFactoryNames(type, classLoader));// 1.
List<T> instances = createSpringFactoriesInstances(type, parameterTypes,// 2.
classLoader, args, names);
AnnotationAwareOrderComparator.sort(instances);//
return instances;
}
1.1工場名のロード(loadFactoryNames)現在のクラスのキャリアはMETA-INF/spring.factoresファイルからSpringAplication RunListener類の配置を取得します。
public static List<String> loadFactoryNames(Class<?> factoryClass, ClassLoader classLoader) {
String factoryClassName = factoryClass.getName();
try {
Enumeration<URL> urls = (classLoader != null ? classLoader.getResources(FACTORIES_RESOURCE_LOCATION) :
ClassLoader.getSystemResources(FACTORIES_RESOURCE_LOCATION));
List<String> result = new ArrayList<String>();
while (urls.hasMoreElements()) {
URL url = urls.nextElement();
Properties properties = PropertiesLoaderUtils.loadProperties(new UrlResource(url));
String factoryClassNames = properties.getProperty(factoryClassName);
result.addAll(Arrays.asList(StringUtils.commaDelimitedListToStringArray(factoryClassNames)));
}
return result;
}
catch (IOException ex) {
throw new IllegalArgumentException("Unable to load [" + factoryClass.getName() +
"] factories from location [" + FACTORIES_RESOURCE_LOCATION + "]", ex);
}
}
上の図は、工場名を取得したら、META-INF/spring.factoresに定義されているものを見てみましょう。
# PropertySource Loaders
org.springframework.boot.env.PropertySourceLoader=\
org.springframework.boot.env.PropertiesPropertySourceLoader,\
org.springframework.boot.env.YamlPropertySourceLoader
# Run Listeners , !!!!
org.springframework.boot.SpringApplicationRunListener=\
org.springframework.boot.context.event.EventPublishingRunListener
# Application Context Initializers
org.springframework.context.ApplicationContextInitializer=\
org.springframework.boot.context.ConfigurationWarningsApplicationContextInitializer,\
org.springframework.boot.context.ContextIdApplicationContextInitializer,\
org.springframework.boot.context.config.DelegatingApplicationContextInitializer,\
org.springframework.boot.context.embedded.ServerPortInfoApplicationContextInitializer
# Application Listeners
org.springframework.context.ApplicationListener=\
org.springframework.boot.ClearCachesApplicationListener,\
org.springframework.boot.builder.ParentContextCloserApplicationListener,\
org.springframework.boot.context.FileEncodingApplicationListener,\
org.springframework.boot.context.config.AnsiOutputApplicationListener,\
org.springframework.boot.context.config.ConfigFileApplicationListener,\
org.springframework.boot.context.config.DelegatingApplicationListener,\
org.springframework.boot.liquibase.LiquibaseServiceLocatorApplicationListener,\
org.springframework.boot.logging.ClasspathLoggingApplicationListener,\
org.springframework.boot.logging.LoggingApplicationListener
# Environment Post Processors
org.springframework.boot.env.EnvironmentPostProcessor=\
org.springframework.boot.cloud.CloudFoundryVcapEnvironmentPostProcessor,\
org.springframework.boot.env.SpringApplicationJsonEnvironmentPostProcessor
# Failure Analyzers
org.springframework.boot.diagnostics.FailureAnalyzer=\
org.springframework.boot.diagnostics.analyzer.BeanCurrentlyInCreationFailureAnalyzer,\
org.springframework.boot.diagnostics.analyzer.BeanNotOfRequiredTypeFailureAnalyzer,\
org.springframework.boot.diagnostics.analyzer.BindFailureAnalyzer,\
org.springframework.boot.diagnostics.analyzer.ConnectorStartFailureAnalyzer,\
org.springframework.boot.diagnostics.analyzer.NoUniqueBeanDefinitionFailureAnalyzer,\
org.springframework.boot.diagnostics.analyzer.PortInUseFailureAnalyzer,\
org.springframework.boot.diagnostics.analyzer.ValidationExceptionFailureAnalyzer
# FailureAnalysisReporters
org.springframework.boot.diagnostics.FailureAnalysisReporter=\
org.springframework.boot.diagnostics.LoggingFailureAnalysisReporter
わあ、全部の種類のフルネームで、keyはインターフェースで、valueは全部実現類です。key=「org.springframe ebook.boot.SpringAplication RunListener」によると、実現した種類のvalue=「org.springframe ework.boot.com.event.Event.Event PublishingRunListener」イベントの公開モニターがあります。1.2スプリング工場の作成例(createSprigFactoricInstance)
第1ステップで得られたSet<String>names(SpringAppliation RunListenerの唯一の実現クラスEventPublishingRunListener)に従って、「イベントリリース起動モニター」の工場例を生成する。
@SuppressWarnings("unchecked")
private <T> List<T> createSpringFactoriesInstances(Class<T> type,
Class<?>[] parameterTypes, ClassLoader classLoader, Object[] args,
Set<String> names) {
List<T> instances = new ArrayList<T>(names.size());
for (String name : names) {
try {
Class<?> instanceClass = ClassUtils.forName(name, classLoader);//
Assert.isAssignable(type, instanceClass);
Constructor<?> constructor = instanceClass
.getDeclaredConstructor(parameterTypes);//
T instance = (T) BeanUtils.instantiateClass(constructor, args);//
instances.add(instance);
}
catch (Throwable ex) {
throw new IllegalArgumentException(
"Cannot instantiate " + type + " : " + name, ex);
}
}
return instances;
}
コンテキストを用意
private void prepareContext(ConfigurableApplicationContext context,
ConfigurableEnvironment environment, SpringApplicationRunListeners listeners,
ApplicationArguments applicationArguments, Banner printedBanner) {
context.setEnvironment(environment);
postProcessApplicationContext(context);// BeanNameGenerator, ResourceLoader
applyInitializers(context);//
listeners.contextPrepared(context);// " "
if (this.logStartupInfo) {
logStartupInfo(context.getParent() == null);
logStartupProfileInfo(context);
}
// spring boot bean
context.getBeanFactory().registerSingleton("springApplicationArguments",
applicationArguments);
if (printedBanner != null) {
context.getBeanFactory().registerSingleton("springBootBanner", printedBanner);
}
//
Set<Object> sources = getSources();
Assert.notEmpty(sources, "Sources must not be empty");
load(context, sources.toArray(new Object[sources.size()]));
listeners.contextLoaded(context);// " "
}
コンテキストを更新
private void refreshContext(ConfigurableApplicationContext context) {
refresh(context);//
if (this.registerShutdownHook) {
try {
context.registerShutdownHook();// ,
}
catch (AccessControlException ex) {
// Not allowed in some environments.
}
}
}
protected void refresh(ApplicationContext applicationContext) {
Assert.isInstanceOf(AbstractApplicationContext.class, applicationContext);
((AbstractApplicationContext) applicationContext).refresh();
}
最終的に実行されるのは、AbstractAplicationControtext抽象類のrefresh方法です。
public void refresh() throws BeansException, IllegalStateException {
synchronized (this.startupShutdownMonitor) {
// , 。
prepareRefresh();
// refreshBeanFactory . xml
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
// BeanFactory , 、 .
prepareBeanFactory(beanFactory);
try {
// BeanFactory . , 。
postProcessBeanFactory(beanFactory);
// BeanFactory , Bean .
invokeBeanFactoryPostProcessors(beanFactory);
// Bean , Bean .
registerBeanPostProcessors(beanFactory);
// ,
initMessageSource();
// ApplicationEventMulticaster bean,
initApplicationEventMulticaster();
// Bean, , 。
onRefresh();
// Bean
registerListeners();
// (non-lazy-init) Bean.
finishBeanFactoryInitialization(beanFactory);
// , refresh .
finishRefresh();
}
catch (BeansException ex) {
if (logger.isWarnEnabled()) {
logger.warn("Exception encountered during context initialization - " +
"cancelling refresh attempt: " + ex);
}
// Bean, .
destroyBeans();
// refresh , active .
cancelRefresh(ex);
// Propagate exception to caller.
throw ex;
}
finally {
// Spring
resetCommonCaches();
}
}
}
コンテキストを更新した後spring bootが提供する2つのユーザーが自分で開拓するインターフェース:Application RunnerとCommand Liner。コンテナ起動後(コンテキストリフレッシュ後)に実行し、同様のデータ初期化を行うことができます。
private void callRunners(ApplicationContext context, ApplicationArguments args) {
List<Object> runners = new ArrayList<Object>();
runners.addAll(context.getBeansOfType(ApplicationRunner.class).values());// ApplicationRunner bean
runners.addAll(context.getBeansOfType(CommandLineRunner.class).values());// CommandLineRunner bean
AnnotationAwareOrderComparator.sort(runners);//
for (Object runner : new LinkedHashSet<Object>(runners)) {
if (runner instanceof ApplicationRunner) {
callRunner((ApplicationRunner) runner, args);//
}
if (runner instanceof CommandLineRunner) {
callRunner((CommandLineRunner) runner, args);
}
}
}
二つの違いは入参と違って、実際の状況によって自分で選ぶことです。
public interface CommandLineRunner {
void run(String... args) throws Exception;
}
public interface ApplicationRunner {
void run(ApplicationArguments args) throws Exception;
}
CommundLineline Runnerで実行されるパラメータは、元々のjava起動タイプmainメソッドのString[]args文字列配列パラメータである。Application Runnerにおけるパラメータは、処理を経ていくつかの方法を提供する。
List<String> getOptionValues(String name);
名称取得値リストによると、java起動コマンドのうち、foo=bar--foo=bazは、fooパラメータ名からlist[bar],[baz]に戻ります。三、まとめ
前の分析によれば、Spring-boot容器起動プロセスは全体的に2つの部分に分けられます。
1)注を実行する:指定範囲のbeanをスキャンし、自動配置類に対応するbeanを読み込み、IOC容器にロードする。
2)マンメソッドの具体的なSpringApplitions.run()は、全流れがSprigAplication Eventを貫いています。6つのサブクラスがあります。
ApplicationFailedEvent.class
ApplicationPreparedEvent.class
ApplicationReadyEvent.class
ApplicationStartedEvent.class
ApplicationStartingEvent.class
SpringApplicationEvent.class
ここでは古典的なspringイベント駆動モデルを使用しています。航空券:Springイベント駆動モデルと観察者モードクラス図は以下の通りです
上記のように、古典的なspringイベント駆動モデルであり、3つのキャラクターが含まれています。イベントリリース者、イベント、傍受者です。spring-bootに対応しています。
1.Event PublishingRunListenerという種類のパッケージがイベントリリースされました。
2.SprigAplication Eventは、spring-bootで定義されているイベント(上に述べた6つのイベント)であり、Application Event(springで定義されている)から引き継ぎます。
3.前記6つのイベントに対するモニターを実施していません。ここではユーザが自分でリスナー(上記6つのイベント)を実現して、スプリングブック容器の起動プロセスを注入し、該当イベントをトリガします。
例えば、Appliation Listener<Application ReadyEvent>というインターフェースを実現し、容器起動が完了した時に最後のステップlistener.finishedを実行する場合、起動に異常がなければ実行します。データ初期化などの操作ができます。
締め括りをつける
以上は小编が皆さんに绍介したspring boot容器の起动に関する知识です。皆さんに助けてほしいです。もし何か疑问があれば、メッセージをください。小编はすぐに皆さんに返事します。ここでも私たちのサイトを応援してくれてありがとうございます。