Spring Cloudが人気がある瞬間、基本原則を理解していない場合は非常に混乱しています(構成よりも大きい合意だけですが、原則はどうですか?なぜこれを行う必要があるのですか?)。スプリングクラウドは、スプリングブーツに基づいてすぐに構築されます。今日は、Spring Boot Container Startup Processをご覧ください。 (この記事では、Spring Bootをすばやく起動する方法を説明していません。公式Webサイト、公式Webサイトドキュメントエアチケットで直接読むだけです)
Spring Bootは、通常、メインメソッドを起動し、次の図に示すように、コマンドラインでJARパッケージを起動するようにコンテナを指定します。
@springBootApplicationPublic class Application {public static void main(string [] args){springApplication.run(application.class、args); }}ここに2つのことがあります。
1。@springBootApplicationアノテーション
2。SpringApplication.run()静的メソッド
これらの2つの内容を以下に個別に調べてみましょう。
ソースコードは次のとおりです。
@target(elementtype.type)@retention(retentionPolicy.runtime)@documented @inherited @springbootconfiguration @enableautoconfiguration @componentscan = {@filter(type = filtertype.custom = classes = classes = typeexcludefil.class) filterType.custom、classes = autoconfigurationexcludefilter.class)})public @interface springbootapplication {コアノート:
@SpringBootConfiguration(実際には@Configuration):これがJavaconFig構成クラスであることを意味します。このクラスでは、豆、依存関係などをカスタマイズできます。 - これは、スプリングブートのユニークな注釈であり、一般的に使用されます。
@enableautoconfiguration:@importの助けを借りて、自動構成基準をIOCコンテナに満たすすべてのBean定義をロードします(ルートパッケージパスの下に配置することをお勧めします。 - これには詳細な掘削が必要です!
@ComPonentsCan:スプリングの自動スキャン注釈。スキャン範囲を定義してIOCコンテナにロードできます。 - これはこれを言うことはもうありません、誰もが春の注釈に精通している必要があります。
annotation @enableautoconfigurationのソースコード:
@suppresswarnings( "DepRecation")@target(elementType.type)@retention(retentionPolicy.runtime)@documented @inherited @autoconfigurationpackage @import(enableautoconfigurationimportselecter.class)公開
コアは、次のようにenableautoconfigurationimportsecrecercerectorのクラス図です。
Coreメソッドは、トップレベルのインターフェイスImportSelectorでselectedimports()であり、ソースコードは次のとおりです。
@Override public String [] selectimports(annotationmetadata annotationmetadata){if(!isenabled(annotationmetadata)){return no_imports; } try {// 1。 Meta-INF/Spring-AutoconFigure-Metadata.Propertiesファイル(一部がデフォルト値)、AutoconfigurationMeturationMetadata = autoconfigurationmetadataloader .loadmetadata(this.beanclassodata); annotationAttributes属性= getattributes(annotationmetadata); // 2。 Annotation属性リスト<String> configurations = getCandidateConFigurations(AnnotationMetadata、//3。97自動構成クラス属性を取得)を取得します。構成= removeduplicates(構成); // 4。複製構成を削除= sort(configurations、autoconfigurationmetadata); // 5。並べ替え<string> excludes = getExclusions(annotationmetadata、属性); // 6。 get checkexcludedclasses(構成、除外); // 7。除外されたクラス構成を確認します。RemoveAll(除外); // 8。除外する必要があるすべての構成を削除= filter(configurations、autoconfigurationmetadata); // 9。フィルターonClassCondition(アノテーションで構成されたものは、特定のクラスが存在する場合にのみ有効になります)自動構成のトリガーリスニングイベントreturn Configurations.toarray(new String [configurations.size()]); } catch(ioException ex){新しいIllegalStateException(ex); }}ここに3つのコアメソッドがあります。
1)Loadmetadataロード構成
実際、クラスローダーを使用してロードして:Meta-Inf/Spring-Autoconfigure-metadata.properties(Spring-boot-autoconfigure-1.5.9.Release-sources.jar)ファイルで定義されている構成は、プロパティautoconfigurationmeta(Propertiesautoconfigurationmeta)を返します。
2)getCandidateConFigurationsデフォルトのサポートされている自動構成クラス名リストを取得する
surnfactoriesloader.loadfactoryNames自動構成クラスの構成を取得するspringfactoriesloader。
保護されたリスト<String> getCandidateConfigurations(annotationmetadataメタデータ、annotationAttributes属性){//そうです、ここでの2つのパラメーターは役に立たない...リスト<文字列>設定= springfactoriesloader.loadfactorynames(getSpringFactoriesFactoryFactoryFactoryFactoryClass(); assert.notempty(configurations、 "Meta-inf/spring.Factoriesで見つかった自動構成クラスはありません。「 +」がカスタムパッケージを使用している場合は、ファイルが正しいことを確認してください。」);構成を返す; } //リターンはenableautoconfigurationクラス保護されたクラス<?> getSpringFactoriesLoaderFactoryClass(){return enableautoconfiguration.class; }あなたは実際に何を得ましたか? Spring.Factoriesファイルは次のとおりです。実際には、#AUTO Configure自動構成モジュールのすべてのクラスが取得されます。
#hiveryizersorg.springframework.context.applicationcontextinitializer =/org.springframework.boot.autoconfigure.sharedmetadatareaderfactorycontextinitializer、/org.springframework.boot.autoconfigure.logging.autoconfigurationturation.logging.autoconfigurationturation riendersorg.springframework.context.applicationlistener =/org.springframework.boot.autoconfigure.backgroundpreinitializer#自動構成インポートristenersorg.springframework.boot.autoconfigure.autoconfigurationimportlistener =/org.springframework.boot.autoconfigure.condition.conditionevaluationreportautoconfigurationimportlistener#自動構成のインポートfilterSorg.springframework.boot.autoconfigure.autoconfigurationimportfilter =/org.springframework.boot.autoconfigure.condition.onclasscontition springframework.boot.autoconfigure.enableautoconfiguration =/org.springframework.boot.autoconfigure.admin.springApplicationAdminjmxautoconfiguration、/org.springframework.boot.autoconfigure.aop.aop.aop.aop.aop.aop. ingframework.boot.autoconfigure.amqp.rabbitautoconfiguration、/org.springframework.boot.autoconfigure.batch.batchautocon Figuration、/org.springframework.boot.autoconfigure.cache.cacheautoconfiguration、/org.springframework.boot.autoconfigure .cassandra.cassandraautoconfiguration、/org.springframework.boot.autoconfigure.cloud.cloudautoconfiguration、/org.springframework.boot.autoconfigure.context.configurationPropertiesautoconuration、/org.sprigurwork ontext.messagesourceautoconfiguration、/org.springframework.boot.autoconfigure.context.plopertyholderautoconfiguration、/org.springframework.boot.autoconfigure.couchbase.couchbase.couchOnfiguration、/org.sprung.sprung.sprung. e.dao.persistenceExceptionTranslationAutoconfiguration、/org.springframework.boot.autoconfigure.data.cassandra.cassandr adataautoconfiguration、/org.springframework.boot.autoconfigure.data.cassandra.cassandrarepositoriesautoconfiguration、/o rg.springframework.boot.autoconfigure.data.couchbase.couchbasedataautoconfiguration、/org.springframework.boot.autoconfi gure.data.couchbase.couchbaserepositoriesautoconfiguration、/org.springframework.boot.autoconfigure.data.elasticsearch.e lasticsearchautoconfiguration、/org.springframework.boot.autoconfigure.data.elasticsearch.elasticsearchdatauutoconfiguration、/org.springframework.boot.autoconfigure.data.elasticsearch ramework.boot.autoconfigure.data.jpa.jparepositoriesautoconfiguration、/org.springframework.boot.autoconfigure.data.ldap .ldapdataautoconfiguration、/org.springframework.boot.autoconfigure.data.ldap.ldaprepositoriesautoconfiguration、/org.spr ingframework.boot.autoconfigure.data.mongo.mongodataautoconfiguration、/org.springframework.boot.autoconfigure.data.mon go.mongorepositoriesautoconfiguration、/org.springframework.boot.autoconfigure.data.neo4j.neo4jdataautoconfiguration、/or g.springframework.boot.autoconfigure.data.neo4j.neo4jrepositoriesautoconfiguration、/org.springframework.boot.autoconfig ure.data.solr.solrrepositoriesautoconfiguration、/org.springframework.boot.autoconfigure.data.redis.redisautoconfigurati on、/org.springframework.boot.autoconfigure.data.redis.redisrepositoriesautoconfiguration、/org.springframework.boot.auto configure.data.rest.repositoryrestmvcautoconfiguration、/org.springframework.boot.autoconfigure.data.web.springdatawebau toconfiguration、/org.springframework.boot.autoconfigure.elasticsearch.jest.jestautoconfiguration、/org.springframework.b oot.autoconfigure.freemarker.freemarkerautoconfiguration、/org.springframework.boot.autoconfigure.gson.gsonautoconfigura tion、/org.springframework.boot.autoconfigure.h2.h2consoleautoconfiguration、/org.springframework.boot.autoconfigure.hateoas.hypermediaautoconfiguration、/org.sp ringframework.boot.autoconfigure.hazelcast.hazelcastautoconfiguration、/org.springframework.boot.autoconfigure.hazelcastautoconfiguration、/org.spring ngframework.boot.autoconfigure.hazelcast.hazelcastjpadepdencyautoconfiguration、/org.springframework.boot.autoconfigure.info.projectinfoautoconfiguration、/org.springframework.boot.autoconfigure rg.springframework.boot.autoconfigure.jackson.jacksonautoconfiguration、/org.springframework.boot.autoconfigure.jdbc.dat asourceautoconfiguration、/org.springframework.boot.autoconfigure.jdbc.jdbctemplateautoconfiguration、/org.springframewor k.boot.autoconfigure.jdbc.jndidatasourceautoconfiguration、/org.springframework.boot.autoconfigure.jdbc.xadatasourceauto構成、/org.springframework.boot.autoconfigure.jdbc.datasourcetransactionmanagerautoconfiguration、/org.springfra mework.boot.autoconfigure.jms.jmsautoconfiguration、/org.springframework.boot.autoconfigure.jmx.jmxautoconfiguration、/o rg.springframework.boot.autoconfigure.jms.jndiconnectionfactoryautoconfiguration、/org.springframework.boot.autoconfigur e.jms.activemq.activemqautoconfiguration、/org.springframework.boot.autoconfigure.jms.aremis.artemisautoconfiguration、/ org.springframework.boot.autoconfigure.flyway.flywayautoconfiguration、/org.springframework.boot.autoconfigure.groovy.te mplate.groovytemplateautoconfiguration、/org.springframework.boot.autoconfigure.jersey.jerseyautoconfiguration、/org.springframework.boot.autoconfigure.joo Q.jooqautoconfiguration、/org.springframework.boot.autoconfigure.kafkaautoconfiguration、/org.springframework.boot.autoconfigure.kafka.kafkaautoconfi guration、/org.springframework.boot.autoconfigure.ldap.embeded.embededdeddapautoconfiguration、/org.springframework.boot。 autoconfigure.ldap.ldapautoconfiguration、/org.springframework.boot.autoconfigure.liquibase.liquibaseautoconfiguration、/ org.springframework.boot.autoconfigure.mail.mailsenderautoconfiguration、/org.springframework.boot.autoconfigure.mail.m ailsendervalidatorautoconfiguration、/org.springframework.boot.autoconfigure.mobile.deviceresolverautoconfiguration、/org .springframework.boot.autoconfigure.mobile.devicedelegatingViewResolververautoconfiguration、/org.springframework.boot.auto configure.mobile.sitepreferenceautoconfiguration、/org.springframework.boot.autoconfigure.mongo.embedded.embeddedmongoau toconfiguration、/org.springframework.boot.autoconfigure.mongo.mongoautoconfiguration、/org.springframework.boot.autoconf igure.mustache.mustacheautoconfiguration、/org.springframework.boot.autoconfigure.orm.jpa.hibernatejpaautoconfiguration、 /org.springframework.boot.autoconfigure.reactor.Reactorautoconfiguration,/org.springframework.boot.autoconfigure.security.securityautoconfiguration,/org.spring framework.boot.autoconfigure.security.securityfilterautoconfiguration、/org.springframework.boot.autoconfigure.security.securityfilterautoconfiguration、/org.spri ngframework.boot.autoconfigure.security.fallbackwebsecurityautoconfiguration、/org.springframework.boot.autoconfigure.security.oauth2.oauth2autoconfiguration 、/org.springframework.boot.autoconfigure.sendgrid.sendgridautoconfiguration、/org.springframework.boot.autoconfigure.sendgrid.sendgridautoconfiguration、/org。 springframework.boot.autoconfigure.session.sessionautoconfiguration、/org.springframework.boot.autoconfigure.social.socialwebautoconfiguration、/org.springframework.boot.autoconfigure.social.pacebookbookconfiguration. ot.autoconfigure.social.linkedinautoconfiguration、/org.springframework.boot.autoconfigure.social.twitterautoconfigurati on、/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.autcon.boot.autoconfiguration AlidationAutoconfiguration、/org.springframework.boot.autoconfigure.web.dispatcherservletautoconfiguration、/org.springf ramework.boot.autoconfigure.web.embeddedservletcontainerautoconfiguration、/org.springframework.boot.autoconfigure.web.e errormvcautoconfiguration、/org.springframework.boot.autoconfigure.web.httpencodingautoconfiguration、/org.springframewor k.boot.autoconfigure.web.httpmessageconverterautoconfiguration、/org.springframework.boot.autoconfigure.web.multipartaut oconfiguration、/org.springframework.boot.autoconfigure.web.serverpropertiesautoconfiguration、/org.springframework.boot.autoconfigure.web.webclientautoconfiguration、/org.s pringframework.boot.autoconfigure.websocket.websocketautoconfiguration、/org.springframework.boot.autoconfigure.websocketmessagingautoconfiguration、/org.springframework.boot.autoconfigure.webservures.webservuresconcure.webservurecure.webservures.webservure.webservure.webservures.webservigure.webservures.webservure.webservure.webservure.webservure. AnalyzerSorg.springframework.boot.diagnostics.failureAnalyzer =/org.springframework.boot.autoconosticure.diagnostics.analyzer.nosuchbeandefinitionfaileanalyzer、/org。 springframework.boot.autoconfigure.jdbc.datasourcebeancreationfailureAnalyzer、/org.springframework.boot.autoconfigure.jdbc.hikaridriverconfigurationfailureanalyzer#テンプレートの可用性providerSorg.springframework.boot.autoconfigure.template.templateavailabilityprovider =/org.springframework.boot.autoconfigure.fre emarker.freemarkertemplateavailabilityprovider、/org.springframework.boot.autoconfigure.mustache.mustacheteTemplateavailabilityprovi der、/org.springframework.boot.autoconfigure.groovy.template.groovytemplateavailabilityprovider、/org.springframework.boot.autoconf igure.thymeleaf.thymeleaeftemplateavailabilityprovider、/org.springframework.boot.autoconfigure.web.jsptemplateavailabilityprovider
3)フィルターフィルターは、OnClassCondition Annotationを満たさない条件をフィルタリングします
プライベートリスト<String>フィルター(List <String> Configurations、autoconfigurationmetadata autoconfigurationmetadata){long starttime = system.nanotime(); string [] condations = configurations.toarray(new String [configurations.size()]); boolean [] skip = new boolean [condatis.length]; booleanスキップ= false; //フィルタリングする必要がある自動構成インポートインターセプターを取得するには、spring.factories構成:org.springframework.boot.autoconfigure.conconfigure.onclasscondition for(autoconfigurationimportfilterフィルター:getautoconfigurationimportfilters()){invokeawaremethods(filter); boolean [] match = filter.match(候補者、autoconfigurationmetadata); for(int i = 0; i <match.length; i ++){if(!match [i]){skip [i] = true;スキップ= true; }}} if(!skipped){// 1つの不一致がある限り - > skipped = true、すべての一致 - 》 skipt = false->直接戻ります。 } list <String> result = new ArrayList <String>(constaties.length); for(int i = 0; i <condations.length; i ++){if(!skip [i]){// match-》 s skip-はresults result.add(condations [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"); } new arrayList <String>(result)を返します。 }SpringApplication.run
public configureableapplicationContext run(string ... args){stopwatch stopwatch = new StopWatch(); stopwatch.start(); configureableapplicationContext context = null; FailureAnalyzers Analyzers = null; configureheadlessproperty(); SpringApplicationRunListenersリスナー= getRunListeners(args); // 1。リスナーのリスナーを取得します。-starting(); try {applicationArguments applicationArguments = new DefaultApplicationArguments(args); configureableenvironment環境= prepareenvironment(リスナー、//2。環境を準備し、ApplicationEnvironment -PreparedEvent Event ApplicationArgumentsをトリガーします。 Banner PrintedBanner = printbanner(環境); //スタートアッププロンプト文字、デフォルトのスプリング文字ダイアグラムコンテキスト= createapplicationContext(); //設定可能なアプリケーションコンテキストアナライザー= new FailureAnalyzers(コンテキスト); prepereContext(コンテキスト、環境、リスナー、アプリケーションアレグメント、//3。コンテキストPrintedBannerを準備); refresscontext(context); // 4。 Context afterfresh(Context、ApplicationArguments); // 5。コンテキストリスナーをリフレッシュした後、フィニッシュ(コンテキスト、null); - 閉じる! stopwatch.stop(); if(this.logstartupinfo){new StartupInfologger(this.mainApplicationClass).logstarted(getApplicationLog()、sopwatch); } return Context; } catch(throwable ex){handlerunfailure(コンテキスト、リスナー、アナライザー、ex);新しいIllegalStateException(Ex); }}1.GetRunListenersはリスナーを取得します(SpringApplicationRunListeners)
実際、SpringApplicationRunListenerクラスです
private springApplicationRunListeners getRunListeners(String [] args){class <?> [] Types = new class <?新しいSpringApplicationRunListeners(Logger、GetSpringFactoryStances(SpringApplicationRunListener.class、types、this、args))を返します。 } private <t> collection <? t> getSpringFactOriesInstances(class <t> type){return getSpringFactoriesInstances(type、new class <?> [] {}); } private <t> collection <? t> getSpringFactoriesInstances(class <t> type、class <? //設定を使用して文字列の一意性<string> names = new linkedhashset <string>(springfactoriesloader.loadfactoryNames(type、classloader)); // 1。工場出荷時のコレクションリスト<t>インスタンス= createSpringFactoriesInstances(タイプ、パラメタタイプ、// 2。 AnnotationAwareOrderComparator.Sort(インスタンス); // returnインスタンスを並べ替えます。 }1.1ファクトリー名の読み込み(LoadFactoryNames)
現在のクラスのクラスローダーは、Meta-inf/spring.FactoriesファイルからSpringApplicationRunListenerクラスの構成を取得します
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();プロパティプロパティ= PropertiesLoaderUtils.LoadProperties(new UrlResource(URL)); String FactoryClassNames = Properties.GetProperty(FactoryClassName); result.addall(arrays.aslist(stringutils.commadelimitedListtoStringArray(FactoryClassNames))); } return result; } catch(ioException ex){新しいIllegalargumentException( "ロードできない[" + factoryclass.getName() + "]場所[" + factories_resource_location + "]"、ex); }}上の写真では、工場のクラス名を取得した後、Meta-INF/Spring.Factoriesで定義されているものを見てみましょう。
#PropertySource LoaderSorg.springframework.boot.env.propertysourceloader =/org.springframework.boot.env.propertiespropertispertysourceloader、/org.springframework.boot.env.yamlportysourcelceloader ! ! ! org.springframework.boot.springApplicationRunlistener =/org.springframework.boot.context.event.eventpublishingRunlistener#アプリケーションコンテキストinitializersorg.springframework.context.applicationcontextinitializer =/org.springframework.boot.context.configurationwarningsapplicationcontextinitializer、/org.springframework.boot.context.contextid ApplicationContextInitializer、/org.springframework.boot.context.config.delegatingApplicationContextinitializer、/org.springframework.boot.context.embedded.serverportinfoapplicationContextinitializer#アプリケーションristenersorg.springframework.context.applicationlistener =/org.springframework.boot.clearcachesapplicationlistener、/org.springframework.boot.builder.parentcontextcloserap plicationListener、/org.springframework.boot.context.fileencodingapplicationlistener、/org.springframework.boot.context.config.ansioutputapplicationlistener、/org.springfra mework.boot.context.config.configfileapplicationListener、/org.springframework.boot.context.config.delegatingApplicationListener、/org.springframework.boot.liquibase.liqui BaseservicelocatorApplicationListener、/org.springframework.boot.logging.classpathloggingapplicationlistener、/org.springframework.boot.logging.loggingApplicationListener#環境POSSORSORG.SPRINGFRAMEWORK.BOOT.ENV.ENVIRONMENTPOSTPROCERSES =/org.springframework.boot.cloud.cloudryvcapenvironmentpostprocessor、/org.springframework.boot.env.env.springapplicationJsonenvironmentprocsessess AnalyzerSorg.springframework.boot.diagnostics.failureAnalyzer =/org.springframework.boot.diagnostics.analyzer.beancurlentyincreationfailureAnalyzer、/org。 springframework.boot.diagnostics.analyzer.beannotofrequiredtypefailureanalyzer、/org.springframework.boot.diagnostics.analyzer.bindfailureAnalyzer、/org.spr ingframework.boot.diagnostics.analyzer.connectorStartfailureAnalyzer、/org.springframework.boot.diagnostics.analyzer.nouniquebeandefinitionfailureAnalyzer、 /org.springframework.boot.diagnostics.analyzer.portinusefailureanalyzer,/org.springframework.boot.diagnostics.analyzer.validationexceptionfailureAnalyzer# FailureAnalisisReportersorg.springFramework.boot.diagnostics.failureAnalysisReporter =/org.springframework.boot.diagnostics.loggingfailureAnalysisResisReporter
うわー、これらのクラスはすべてフルネームを持ち、キーはインターフェイスであり、値は実装クラスです。実装クラス値= "org.springframework.boot.springApplicationRunlistener" key = "org.springframework.boot.context.event.eventpublishingRunlistener"イベントリリースとリスナーを開始します。推測したら、「反射」を使用して、クラス名に基づいてクラスインスタンスを取得する必要があります。以下はすぐに確認されます...
1.2 Spring Factoryインスタンスを作成します
最初のステップで取得したset <string> names(SpringApplicationRunlistenerの唯一の実装クラスEventPublishingRunLunListener)に基づいて、「EventPublishing Startリスナー」ファクトリーインスタンスを生成します
@suppresswarnings( "unchecked")private <t> list <t> createSpringFactoriesInstances(クラス<t>タイプ、クラス<?> []パラメータ型、クラスローダークラスローダー、オブジェクト[] args、set <tring> names){list <t> instances = new arraylist <t>(namesize()); for(string name:names){try {class <?> instanceclass = classutils.forname(name、classloader); // reflectionを使用してclass assert.isassignable(type、instanclass); constructor <?> constructor = instanceClass .getDeclaredConstructor(parametertypes); // constructor t instance =(t)beanutils.instantiateclass(constructor、args); } catch(throwable ex){新しいIllegalargumentException( "Instantiate" + type + ":" + name、ex); }} returnインスタンス; }コンテキストを準備します
private void prepereContext(ConfigureAbleApplicationContextコンテキスト、ConfigureableEnvironment環境、SpringApplicationRunListenersリスナー、ApplicationArguments ApplicationArguments、Banner PrintedBanner){Context.SetenVironment(環境); postprocessApplicationContext(コンテキスト); // singleton a beannamegenerator、resourceleceladerをアプリケーションコンテキストに設定します。アプリケーションapplyInitializers(コンテキスト); logstartupprofileinfo(context); } //スプリングブートの特別なSingleton Bean Context.getBeanFactory()。registerSingleton( "SpringApplicationArguments"、ApplicationArguments); if(printedbanner!= null){context.getBeanFactory()。registerSingleton( "Springbootbanner"、printedbanner); } //リソースセットをロード<オブジェクト>ソース= getSources(); assert.notempty(ソース、「ソースは空にしてはならない」); load(context、sources.toarray(new object [sources.size()])); listeners.contextLoaded(コンテキスト); //リスナーは「コンテキストロードされた」メソッドを実行します}コンテキストを更新します
private void refreshcontext(configureableableapplicationcontext context){refresh(context); // core class if(this.registershutdownhook){try {context.registershutdownhook(); }}} protected void refresh(applicationContext ApplicationContext){assert.isinstanceof(abstractApplicationContext.class、applicationContext); ((AbstractApplicationContext)ApplicationContext).Refresh(); }最後の実行は、AbstractApplicationContext Abstractクラスの更新方法です。
public void refresh()Throws BeanSexception、IllegalStateException {同期(this.startupshutdownmonitor){//システムのプロパティや環境変数の準備と検証など、コンテキスト環境を更新する準備をします。 prepererefresh(); //サブクラスのrefressbeanFactoryメソッドを起動します。解析XML ConfigureAblElistableBeanFactory beanFactory = gotainFreshBeanFactory(); //クラスローダー、イベントハンドラーなど、BeanFactoryのコンテナ機能を構成します。PrepareBeanFactory(BeanFactory); {// BeanFactoryの後処理を設定します。空の方法、サブクラス拡張のためにそのままにしてください。 PostProcessBeanFactory(BeanFactory); // BeanFactoryのポストプロセッサを呼び出します。BeanFactoryは、Bean定義のコンテナに登録されています。 InvokeBeanFactoryPostProcessors(BeanFactory); //豆のポストプロセッサを登録し、Bean作成プロセス中に電話します。 RegisterBeanPostProcessors(BeanFactory); //コンテキストでメッセージソースを初期化する、つまり、異なる言語のメッセージ本文は、国際的にinitmessageSource()を処理されます。 // ApplicationEventMulticaster Beanを初期化すると、アプリケーションイベント放送局はinitapplicationeventMulticaster()です。 //他の特別な豆、空の方法を初期化し、サブクラス拡張のためにそれらを残します。 onrefresh(); //リスナーBean RegisterListeners()を確認して登録します。 //すべての残り(怠lazyinit)シングルトンビーンをすべてインスタンスします。 FinishBeanFactoryInitialization(BeanFactory); //コンテナイベントを公開し、更新プロセスを終了します。 finishrefresh(); } catch(beansexception ex){if(logger.iswarnenabled()){logger.warn( "コンテキスト初期化中に遭遇した例外 - " + "更新試行のキャンセル:" + ex); } //リソースの消費を避けるために、作成されたシングルトンビーンを破壊します。 DestroyBeans(); //更新操作をキャンセルし、アクティブフラグをリセットします。 cancelrefresh(ex); //発信者に例外を伝播します。 Exを投げる; }最後に{// springのコアキャッシュをリセットリセットリセットコモンキャッチ(); }}}コンテキストを更新した後
Spring Bootは、ユーザーがApplicationRunnerとCommandLinerunnerの2つのインターフェイスを提供します。コンテナが起動した後(コンテキストが更新された後)、データの初期化と同様の操作を実行できます。
private void callrunners(applicationContext Context、ApplicationArguments args){list <object> runners = new ArrayList <Object>(); runners.addall(context.getBeansoftype(applicationRunner.class).values()); // Context runners.addall(conternt.getbeansoftype(commandlinerunner.class).values()); // commandlinerunner of commandlinerunnerのgetallのgetallのgetall(commandlinerunner.class); :new LinkedHashset <Object>(Runners)){if(Runner InstanceOf ApplicationRunner){CallRunner((ApplicationRunner)Runner、Args); // Execute} if(Runner Instanceof CommandLinerunner){Callrunner((CommandLinerunner)Runner、args); }}}2つの違いは、パラメーターが異なることです。そのため、実際の状況に応じて自分で選択してください。
public interface commandlinerunner {void run(string ... args)スロー例外。 } public interface applicationRunner {void run(applicationArguments args)スロー例。 }CommandLinerunnerの実行パラメーターは、元のJava Startupクラスメインメソッドの文字列[] args string arrayパラメーターです。 ApplicationRunnerのパラメーターは、次のような方法を提供するために処理されます。
リスト<文字列> getoptionvalues(string name);
名前に従って値リストを取得します。JavaStartupコマンド - フー= bar - フー= baz、fooパラメーター名に従ってリスト["bar"、 "baz"]を返します
以前の分析によると、スプリングブートコンテナの起動プロセスは2つの部分に分割できます。
1)アノテーションの実行:指定された範囲で豆をスキャンし、自動構成クラスに対応する豆を積み込み、IOCコンテナにロードします。
2)MANメソッドの特定のSpringAppliocation.run()は、SpringApplicationEventを通過し、6つのサブクラスがあります。
ApplicationFailedevent.ClassApplicationPreparedEvent.classApplicationedevent.classApplicationStartedevent.classApplicationStartingEvent.classSpringApplication.class
ここでは、クラシックスプリングイベント駆動型モデル、航空券:春イベント駆動型モデルとオブザーバーモデルを使用します
クラス図は次のとおりです。
上の写真に示されているように、これは、イベントパブリッシャー、イベント、リスナーの3つの役割を含む、古典的な春のイベント駆動型モデルです。スプリングブートに対応するのは次のとおりです。
1.EventPublishingRunListenerこのクラスは、イベントの公開をカプセル化します、
2。SpringApplicationEventは、spring-boot(上記の6つのイベント)で定義されたイベントで、ApplicationEvent(春に定義)から継承されています。
3. 监听者spring-boot并没有实现针对上述6种事件的监听者(我没找到...), 这里用户可以自己实现监听者(上述6种事件)来注入spring boot容器启动流程,触发相应的事件。
例如:实现ApplicationListener<ApplicationReadyEvent>这个接口,在容器启动完毕时最后一步listener.finished时,如果启动没有异常,就会执行!可以做一些数据初始化之类的操作。
要約します
The above is the relevant knowledge about spring boot container startup introduced to you by the editor.それがあなたに役立つことを願っています。ご質問がある場合は、メッセージを残してください。編集者は時間内に返信します。 wulin.comのウェブサイトへのご支援ありがとうございます!