В настоящее время, когда Spring Cloud популярно, это очень запутанно, если вы не понимаете основных принципов (все, что вы видите, это соглашения, которые больше, чем конфигурация, но как насчет принципа? Зачем вам это делать?). Spring Cloud быстро построено на основе Spring Boot. Сегодня мы рассмотрим процесс запуска запуска с весенним загрузочным контейнером. (Эта статья не объясняет, как быстро запустить Spring Boot, просто прочитайте их непосредственно на официальном веб -сайте, на официальном веб -сайте Document Air Bilcets)
Пружинный загрузок обычно указывает контейнер для запуска основного метода, а затем запускайте пакет JAR в командной строке, как показано на рисунке ниже:
@SpringBootApplicationPublic Class Application {public static void main (String [] args) {SpringApplication.Run (Application.Class, Args); }}Вот две вещи:
1. @springbootapplication Annotation
2. Статический метод SpressApplication.run ()
Давайте рассмотрим эти два содержимого отдельно внизу.
Исходный код заключается в следующем:
@Target (elementType.type) @retention (UnfententPolicy.runtime) @documented @inherited @springbootconfiguration @enableautoconfiguration @componentscan (exclidefilter Filtertype.custom, classe = autoconfigurationexcludefilter.class)}) public @Interface SpringBootApplication {Основные примечания:
@Springbootconfiguration (на самом деле @configuration): означает, что это класс конфигурации Javaconfig, вы можете настроить бобы, зависимости и т. Д. В этом классе. -》 Это уникальная аннотация для пружины и обычно используется.
@Enableautoconfiguration: с помощью @Import загрузите все определения бобов, которые соответствуют критериям автоматической конфигурации в контейнер IOC (рекомендуется разместить по пути корневого пакета, чтобы можно было отсканировать подпакинги и классы). -》 Это требует подробного копания!
@Componentscan: автоматическая сканирующая аннотация пружины, которая может определить диапазон сканирования и загрузить его в контейнер МОК. -》 Больше, чтобы сказать это, все должны быть знакомы с аннотациями весны.
Исходный код аннотации @enableautoconfiguration:
@Suppresswarnings ("omemercation") @target (elementtype.type) @retention (artentionpolicy.runtime) @documented @inhyred @autoconfigurationpackage @Import (eNableAutoConfigurationImportSelector.class) public @Interface eNableAtoConfiguration {Ядро - это диаграмма класса EnubleAutoConfigurationImportector Slease следующим образом:
Основной метод выбранного Imports () В Importector Interface Interface на верхнем уровне исходный код заключается в следующем:
@Override public String [] selectImports (AnnotationMetadata annotationMetadata) {if (! Isenabled (AnnotationMetadata)) {return no_imports; } try {// 1. Загрузить 483 Свойства конфигурации из файла Meta-Inf/Spring-Autoconfigure-metadata.properties (некоторые имеют значения по умолчанию), AutoConfigurationMetAdata AutoConfigurationMetadata = AutoConfigurationMetAdatalAder .loadMetAdata (This.BeanClassLoader); Annotationattributes attributes = getattributes (AnnotationMetadata); // 2. Получить список атрибутов аннотации <string> configurations = getCandidateConfigurations (AnnotationMetadata, // 3. Получить 97 атрибутов автоматических классов конфигурации); configurations = elementuplicates (configurations); // 4. Удалить дублирующиеся конфигурации = сортировка (Configurations, AutoConfigurationMetadata); // 5. Sort Set <string> ExcudEds = getExclusions (AnnotationMetadata, Attributes); // 6. Получить checkexcludedclasses (конфигурации, исключает); // 7. Проверьте исключенные конфигурации класса. Removeall (исключения); // 8. Удалить все конфигурации, которые необходимо исключить = Filter (Configurations, AutoConfigurationMetadata); // 9. Фильтр OnclassCondition (настроенный в аннотации вступит в силу только тогда, когда существует определенный класс) FireUutoConfigurationImportEvents (Configurations, Excclusions); // 10. Запустить автоматическую конфигурацию импортируемого прослушивания конфигурации. } catch (ioException ex) {бросить new allogalStateException (ex); }}Вот 3 основных метода:
1) Конфигурация нагрузки нагрузки на LoadMetAdata
Фактически, он должен использовать класс-загрузчик для загрузки: meta-inf/spring-autoconfigure-metadata.properties (Spring-boot-boot-Autoconfigure-1.5.9.. Release-Fources.jar) Конфигурация, определенная в файле, возвращает epertiesautoconfigurationmetadata (внедряет иметадатэдаты.
2) GetCandidateConfigurations Получить список имен имен класса автоматической конфигурации по умолчанию
Автоматическая настройка метода Soul, SpringFactoryloryLoader.LoadFactoryNames
Защищенный список <string> getCandidateConfigurations (AnnotationMetadata Metadata, Annotationattributes attributes) {// Это верно, два параметра здесь бесполезны ... Кто может объяснить мне ... список <string> configurations = GetFactoryRoader.LoadFactoryNames (GetSpringFactoryRectoryCavEractoryClasclasclascLASSCLASSCLASSCLASSCLASS (). Assert.notempty (конфигурации, «Нет классов автоматической конфигурации, найденных в Meta-Inf/Spring.Factories. Если вы» + »используют пользовательскую упаковку, убедитесь, что этот файл правильный.»); вернуть конфигурации; } // Возврат - это защитный класс EnableAutoConfiguration Class <?> GetSpringFactoryLoarderFactoryClass () {return enableAutoConfiguration.class; }Что вы на самом деле получили? Файл Spring.Factories заключается в следующем, который фактически получает все классы модуля автоматической конфигурации #Auto Configure.
# Initializersorg.springframework.context.applicationContextInitialize =/org.springframework.boot.autoconfigure.sharedmetadatareaderfactoryContextInitialize,/org.springFramework.boot.AutoConfigure.Logging.AutoConFigurationReportLog. Alingersorg.springframework.context.applicationlistener =/org.springframework.boot.autoconfigure.backgroundpreinitializer# import Configuration Import Слушайчикрг.springframework.boot.autoconfigure.autoconfigurationImportListener =/org.springframework.boot.autoconfigure.condition.conditionEvaluationReportautoConfigurationImportListener# Автома импорт. Filterorg.springframework.boot.autoconfigure.autoconfigurationImportfilter =/org.springframework.boot.autoconfigure.condition.onclasscondition# Auto Configure Вот все классы автоматической конфигурации. org.springframework.boot.autoconfigure.enableautoconfiguration =/org.springframework.boot.autoconfigure.admin.springApplicationAdminjmxautoconfiguration,/org.sprramework.boot.autoconfigure.aoparop.aopaRyCrureation.AutoConfigure.AOPAPARIGUMOCOP Ingframework.boot.autoconfigure.amqp.rabbitautoconfiguration,/org.springframework.boot.autoconfigure.batch.batchautocon Compaturation,/org.springframework.boot.autoconfigure.cache.cacheautoconfiguration,/org.springframework.boot.autoconfigure .cassandra.cassandraautoconfiguration,/org.springframework.boot.autoconfigure.cloud.cloudautoconfiguration,/org.springframework.boot.autoconfigure.context.configurationpertiesautoconfiguration,/org.sprameworkocrameOr.OutrameRameOrmeRameOr.OutrameRameRameOr.OutrameRameOrmeRameOrmoCor ontext.messagesourceautoconfiguration,/org.springframework.boot.autoconfigure.context.propertyplacehodutoconfiguration,/org.springframework.boot.autoconfigure.couchbase.couchbaseautoconfiguration,/org.springframework.aut.autoconoconoconfiguration,/org.springfirmoconoconconfiguration,/org.springramework.aut.autoconoconfiguration,/org.sprimework.aut.aut.aut 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 TasticsearchAutoConfiguration,/org.springframework.boot.autoconfigure.data.elasticsearch.elasticsearchdatautoconfiguration,/org.springframework.boot.autoconfigure.data.elasticsearch.elasticsearcherearcherearch 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,/или g.springframework.boot.autoconfigure.data.neo4j.neo4jrepositoriesautoconfiguration,/org.springframework.boot.autoconfig ure.data.solr.solrrepositoriesautoconfiguration,/org.springframework.boot.autoconfigure.data.redis.redisautoconfigurati на,/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.hypermediautoconfiguration,/org.sp RingFramework.boot.autoconfigure.hazelcast.hazelcastautoconfiguration,/org.springframework.boot.autoconfigure.hazelcast.hazelcastautoconfiguration,/org.spring ngframework.boot.autoconfigure.hazelcast.hazelcastjpadependencyautoconfiguration,/org.springframework.boot.autoconfigur e.info.projectinfoautoconfiguration,/org.springframework.boot.autoconfigure.integration.integrationautoconfiguration,/o 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.jndadatasourceautoconfiguration,/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.grovytemplateautoconfiguration,/org.springframework.boot.autoconfigure.jersey.jerseyautoconfiguration,/org.springframework.boot.autoconfigure.joo Q.jooqautoconfiguration,/org.springframework.boot.autoconfigure.kafka.kafkaautoconfiguration,/org.springframework.boot.autoconfigure.kafka.kafkautoconfi guration,/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.m AilsendervalidatorAutoconfiguration,/org.springframework.boot.autoconfigure.mobile.deviceresolverautoconfiguration,/org .springframework.boot.autoconfigure.mobile.deviceDelegatingViewResolverAutoConfiguration,/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.hibernatejpautoconfiguration, /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.socialwebuutoconfiguration,/org.springframework.boot.autoconfigure.social.Social.Social.Social.Social.Social.Social.Social.Social.Social.Social.Social.Social.Social ot.autoconfigure.social.linkedinautoconfiguration,/org.springframework.boot.autoconfigure.social.twitterautoconfigurati на,/org.springframework.boot.autoconfigure.solr.solrautoconfiguration,/org.springframework.boot.autoconfigure.thymeleaf .ThymeLeafAutoConfiguration,/org.springframework.boot.autoconfigure.transaction.transactionAutoConfiguration,/org.springframework.boot.autoconfigure.transaction.jta.jtauutoconfiguration,/org.springframework.autoconfiguraturation,/org.springfure.autoconfiguraturaturation,/org.springfure.autoconfiguraturation,/org.springframework. AlidationAutoConfiguration,/org.springframework.boot.autoconfigure.web.dispatcherservletautoconfiguration,/org.springframework.boot.autoconfigure.web.embeddedservletconterautoconfiguration,/org.springframerameRecr errormvcautoconfiguration,/org.springframework.boot.autoconfigure.web.httpencodingautoconfiguration,/org.springframewor k.boot.autoconfigure.web.httpmessageconvertersautoconfiguration,/org.springframework.boot.autoconfigure.web.multipartaut oconfiguration,/org.springframework.boot.autoconfigure.web.serverperpertiesautoconfiguration,/org.springframework.boot.autoconfigure.web.webclientautoconfiguration,/org.s pringframework.boot.autoconfigure.websocket.WebSocketAutoConfiguration,/org.springframework.boot.autoconfigure.websocket.WebSocketMessagingAutoConfiguration,/org.springframework.boot.autoconfigure.webservices.WebServicesAutoConfiguration# Failure Analyzersorg.springframework.boot.diagnostics.failureanalyzer =/org.springframework.boot.autoconfigure.diagnostics.analyzer.nosuchbaindefinitionFailReanaleAnalizer,/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.mustachetemplateaVailabilityprovi der,/org.springframework.boot.autoconfigure.groovy.template.groovytemplateaVailabilityprovider,/org.springframework.boot.autoconf igure.ThyMeleaf.ThymeleaftAteaVailabilityprovider,/org.springframework.boot.autoconfigure.web.jsptemplateavailabilityprovider
3) Фильтр фильтров фильтровал условия, которые не соответствуют аннотации OnClassCondition
Частный список <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 пропустил = false; // Получить автоматическую конфигурацию импорта -перехватчика, который необходимо отфильтровать, есть только один в Spring.Factories Configuration: org.springframework.boot.autoconfigure.condition.onclasscondition для (AutoConfigurationImportfilterfilter: getautoConfigurationFilters ()). boolean [] match = filter.match (кандидаты, AutoConfigurationMetadata); for (int i = 0; i <match.length; i ++) {if (! match [i]) {skip [i] = true; пропустил = true; }}} if (! Specked) {// Пока есть одно несоответствие -> specked = true, все совпадения -》 specked = false-> вернуть непосредственно, чтобы вернуть конфигурации; } List <string> result = new ArrayList <string> (candidates.length); for (int i = 0; i <candidates.length; i ++) {if (! skip [i]) {// match-》 Не пропустить》 Добавить к результату результата. Адд (кандидаты [i]); }} if (logger.istraceenabled ()) {int numberfiltered = configurations.size () - result.size (); logger.trace («Фильтрованное» + numberfiltered + »класс автоматической конфигурации в« + timeunit.nanoseconds.tomillis (system.nanotime () - starttime) + "ms"); } вернуть новый ArrayList <String> (result); }Springapplication.Run
public ConfigurableApplicationContext Run (String ... Args) {Spectwatch Spectwatch = new Spectwatch (); Spectwatch.start (); ConfiguruRableApplicationContext context = null; Проблемы -анализаторы анализаторов = null; ConfigureHeadlessProperty (); SpringApplicationRunlisteners Слушатели = GetRunListeners (Args); // 1. Получите слушателей слушателей.starting ();-> Start! try {ApplicationArguments ApplicationArguments = new DefaultApplicationArguments (args); Настраиваемая среда для окружающей среды = Prepareenvironment (слушатели, // 2. Подготовьте среду и запустите ApplicationEnvironmentPrepareDevent Event ApplicationArguments); Banner printedbanner = printbanner (среда); // печатать символ приглашения запуска, контекст символов Spring по умолчанию = CreateApplicationContext (); // создание конфигурации контекстных анализаторов приложения = New FailureAnalizers (контекст); PrepareContext (контекст, среда, слушатели, ApplicationArguments, // 3. Подготовка контекста PrintedBanner); ForreshContext (контекст); // 4. Обновить контекст AfterRefresh (Context, ApplicationArguments); // 5. После обновления контекстных слушателей. Закончил (контекст, нулевой);-Закрыть! Spectwatch.stop (); if (this.logstartupinfo) {new Startupinfologger (this.mainapplicationclass) .logstarted (getApplicationlog (), spectwatch); } вернуть контекст; } catch (Throwable ex) {handlerUnfailure (контекст, слушатели, анализаторы, Ex); бросить новое нелегальное статей (Ex); }}1. GetrunListeners Get Suldersers (SpringApplicationRunlisteners)
На самом деле это класс SpringApplicationRunlistener
private spressapplicationrunlisteners getRunListeners (string [] args) {class <?> [] types = new Class <?> [] {SpringApplication.class, String []. Class}; вернуть New SpringApplicationRunlisteners (logger, GetSpringFactoryoriesInstances (SpringApplicationRunlistener.class, типы, это, args)); } private <t> Collection <? extends t> getSpringFactoriesInStances (class <t> type) {return getSpringFactoriesInStances (type, новый класс <?> [] {}); } private <t> Collection <? extends t> getSpringFactoriesInStances (класс <T> type, class <?> [] parameterTypes, Object ... args) {classLoader classLoader = thread.currentThread (). getContextClassLoader (); // Использование установки для обеспечения уникальности строк SET <String> names = new LinkedHashSet <String> (SpringFactoryLooryRoader.LoadFactoryNames (type, ClassLoader)); // 1. Загрузить список сбора заводских имен <T> eNTANASS = CreateSpringFactoriesInsInces (Type, ParameterTypes, // 2. Create Factory ClassLoader, Args, names); AnnotationAwareRoderComparator.sort (экземпляры); // Сортировать экземпляры возврата; }1.1 Загрузка заводского имени (LoadFactoryNames)
Загрузчик класса текущего класса получает конфигурацию класса SpringApplicationRunlistener из файла Meta-Inf/Spring.Factories
public Static List <string> loadFactoryNames (class <?> FactoryClass, ClassLoader ClassLoader) {String FactoryClassName = factoryClass.getName (); попробуйте {enumeration <url> urls = (classloader! = null? classloader.getResources (factory_resource_location): classloader.getSystemresources (factory_resource_location)); Список <string> result = new ArrayList <string> (); while (urls.hasmoreElements ()) {url url = urls.nextelement (); Свойства свойства = свойства загрузки. String FactoryClassNames = Properties.getProperty (FactoryClassName); result.addall (arrays.aslist (stringutils.commadelimitedlisttoStringArray (FactoryClassNames))); } return Result; } catch (ioException ex) {бросить new allogalargumentException («Невозможно загрузить [" + factoryclass.getName () + "] фабрики из местоположения [" + factory_resource_location + "]", ex); }}На рисунке выше, после получения названия класса заводского класса, давайте посмотрим на то, что определено в мета-инф/Spring.factories:
# PropertySource LoaderSorg.springframework.boot.env.propertysourceloader =/org.springframework.boot.env.propertiespropertysourceloader,/org.springframework.boot.env.yamlpropertysourceler# Запуск прослушивания здесь! ! ! ! org.springframework.boot.springapplicationrunlistener =/org.springframework.boot.context.event.eventpublishrunlistener# Контекст приложения Initializersorg.springframework.context.applicationContextInitialize =/org.springframework.boot.context.configurationWarningSapplicationContextInitializer,/org.springframework.boot.context.contextId ApplicationContextInitializer,/org.springframework.boot.context.config.delegatingApplicationContextInitializer,/org.springframework.boot.context.embedded.serverportinfoApplicationContextInitializer# Приложение Прослушивание Slustersorg.springframework.context.applicationlistener =/org.springframework.boot.clearcachesapplicationlistener,/org.springframework.boot.builder.parentContextCloserap plictaillistener,/org.springframework.boot.context.fileencodingapplicationlistener,/org.springframework.boot.context.config.ansiOutputApplicationListener,/org.springfra mework.boot.context.config.configfileapplicationListener,/org.springframework.boot.context.config.delegationApplicationListener,/org.springframework.boot.liquibase.liqui BaseServiceLocatorApplicationListener,/org.springframework.boot.logging.classpathloggingApplicationListener,/org.springframework.boot.logging.loggingApplicationListener# Окружающая среда Post Processorg.springframework.boot.env.environmentpostprocessor =/org.springframework.boot.cloud.cloudfoundryvcapenvironmentpostprocessor,/org.springframework.boot.env.springpplicationJsonEnVodumnpormporsprocessor# fauth. env.springpplication Analyzersorg.springframework.boot.diagnostics.failureanalyzer =/org.springframework.boot.diagnostics.analyzer.beancurlyIncreationFailureAnalyzer,/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# FailureAnalysisReporterSorg.springframework.boot.diagnostics.failureAnalysReporter =/org.springframework.boot.diagnostics.loggingFailUeanalysisReporter
Вау, все эти классы имеют полные имена, а клавиши - интерфейсы, а значения - это классы реализации. Мы получаем значение класса реализации = "org.springframework.boot.springapplicationrunlistener" Query на основе Key = "org.springframework.boot.context.event.eventpublishingRunlistener" Выпуск события и запустить слушатель. Как только вы угадаете, вы должны использовать «отражение», чтобы получить экземпляр класса на основе имени класса. Следующее быстро проверяется ...
1.2 Создать экземпляры Spring Factory
Сгенерировать заводской экземпляр «Event Publishing Start Hellocer» на основе наборов <String> имен (единственное класс реализации.
@Suppresswarnings ("unchecked") private <t> list <t> createspringfactoriorysinstances (class <t> type, class <?> [] Parametertypes, classloader classloader, object [] args, set <string> names) {list <t> ences = new ArrayList <t> (names.size ()); for (String name: names) {try {class <?> instanceclass = classutils.forname (name, classloader); // Использовать отражение для получения класса assert.isassignable (type, instanceclass); Конструктор <?> Constructor = instanceClass .getDeclaredConstructor (parameterTypes); // Получить конструктор instance = (t) beanatils.instantiateclass (constructor, args); // Конструировать экземпляры, основанные на конструкторе и параметрах. } catch (Throwable ex) {бросает новый allosalargumentException («не может создать экземпляр» + type + »:" + name, ex); }} вернуть экземпляры; }Подготовьте контекст
Private void PrepareContext (контекст configurableApplicamationContext, конфигурируемая среда проживания, SpringApplicationRunlisteners, слушатели, ApplicationArguments ApplicationArguments, Banner PrintedBanner) {Context.SetenVironment (среда); PostProcessApplicationContext (context); // Singleton A BeanNameGenerator, установите ресурс -загрузчик в контексте приложения ApplyInitializers (Context); // Выполнить инициализатор слушателей. ContextPrepared (context); // Прослушивающий контекст. logstartupprofileinfo (контекст); } // Добавить Spring Boot Special Singleton Bean Context.getBeanFactory (). RegisterSingleton ("SpringApplicationArguments", ApplicationArguments); if (printedbanner! = null) {context.getbeanfactory (). Registersingleton ("Springbootbanner", Printedbanner); } // Загрузите набор ресурсов <object> sources = getSources (); Assert.notempty (источники, «источники не должны быть пустыми»); нагрузка (контекст, источники. Слушатели. ContextLoaded (Context); // Слушатель выполняет метод "Context Loaded"}Обновить контекст
private void refreshcontext (configurableapplicalication context) {rebresh (context); // core class if (this.registershutdownhook) {try {context.registershutdownhook (); // Зарегистрировать закрывающий крючок, выполнять, когда контейнер закрыт} catch (accesscontrolexception ex) {// не разрешено в некоторых средах. }}} Protected void refresh (ApplicationContext ApplicationContext) {assert.isinStanceof (AbstractApplicationContext.Class, ApplicationContext); ((AbstractApplicationContext) ApplicationContext) .refresh (); }Окончательное выполнение - это метод обновления класса AbstractApplicationContext Abstract.
public void refresh () бросает Beansexception, allearlalStateException {synchronized (this.startupshutdownmonitor) {// Подготовка к обновлению контекстной среды, такой как подготовка и проверка свойств системы или переменных среды. PrepareRefresh (); // запустить обстановленного метода подкласса. Parses xml configurablelistablebeanfactory beanfactory = effershbeanfactory (); // Настройка функций контейнера для BeanFactory, таких как загрузчик класса, обработчик событий и т. Д. PrepareBeanFactory (BeanFactory); Попробуйте {// установить пост-обработку BeanFactory. Пустой метод, оставьте его для расширения подкласса. PostProcessBeanFactory (BeanFactory); // Позвоните постпроцессорам BeanFactory, которые зарегистрированы в контейнере в определении бобов. InvokebeanfactoryPostProcessors (BeanFactory); // Зарегистрируйте постпроцессор бобов и позвоните в процесс создания бобов. Registerbeanpostprocessors (Beanfactory); // Инициализировать источник сообщения в контексте, то есть тела сообщений на разных языках обрабатываются на международном уровне initmessagesource (); // инициализируйте бобы ApplicationEventMulticaster, а вещатель событий приложения является initapplicationEventmulticaster (); // Инициализировать другие специальные бобы, пустые методы и оставить их для расширения подкласса. OnRefresh (); // Проверьте и зарегистрируйте прослушивание Bean Beanlisteners (); // экземпляр все оставшиеся (не-ленивые) синглтонские бобы. FinishBeanfactoryinialization (BeanFactory); // публиковать события контейнеров и закончить процесс обновления. finishRefresh (); } catch (beansexception ex) {if (logger.iswarnEnabled ()) {logger.warn ("Исключение встречается во время инициализации контекста -" + "Отмена попытки обновления:" + ex); } // Уничтожение созданных синглтонских бобов, чтобы избежать потребления ресурсов. DestroyBeans (); // Отменить работу обновления и сбросить активное флаг. CancelRefresh (Ex); // распространять исключение на вызывающего абонента. бросить бывш; } наконец {// сбросить ядро кэша Spring ResetCommonCaches (); }}}После обновления контекста
Spring Boot предоставляет два интерфейса для пользователей, чтобы расширить себя: ApplicationRunner и CommandLinerunner. Вы можете выполнить некоторые операции, аналогичные инициализации данных после запуска контейнера (после обновления контекста).
Private void Callrunners (ApplicationContext Context, ApplicationArguments args) {list <object> runners = new ArrayList <Object> (); runners.addall (context.getbeansoftype (applicationrunner.class) .values ()); // getall of type applicationrunner из контекста бегнеров.addall (context.getbeansoftype (commandlinerunner.class) .values ()); // getall of type commandlinnner из контекста annotationawarerator/runnerscorator/runnerscorator (); RUNNER: новый LinkedHashset <Object> (Runners)) {if (ancementOf antaviefUrnner) {callrunner (((ApplicationRunner) Runner, args); // execute} if (ancementOf instanceOf commandlinerunner) {callrunner ((commandlinerunner) runner, args); }}}Два различия в том, что параметры разные, поэтому выбирайте самостоятельно в соответствии с фактической ситуацией.
public interface CommandLinerunner {void run (string ... args) бросает исключение; } public interface ApplicationRunner {void run (ApplicationArguments args) бросает исключение; }Параметрами выполнения в CommandLineRunner являются параметры String String Args String Array оригинального основного метода класса Java Startup; Параметры в ApplicationRunner обрабатываются, чтобы предоставить некоторые методы, такие как:
Список <string> getOptionValues (string name);
Получите список значений в соответствии с именем, в команде Java Startup -Foo = bar -foo = baz, затем вернуть список ["bar", "baz"] в соответствии с именем параметра Foo
Согласно предыдущему анализу, процесс запуска контейнера пружины можно разделить на 2 части:
1) Аннотация выполнения: сканирование бобов в указанном диапазоне загрузите бобы, соответствующие классу автоматической конфигурации, и загрузите их в контейнер IOC.
2) Специальная Springappppliocation.run () в методе человека проходит через SpringApplicationEvent, и есть 6 подклассов:
ApplicationFailEdevent.ClassApplicationPrepareDevent.classApplicationReadeVent.ClassApplicationStartEvent.ClassApplicationStartingEvent.classSpringApplicationEvent.class
Здесь мы используем модель Classic Spring Event Model, Air Ticket: Spring Event Model и модель наблюдателя
Схема классов выглядит следующим образом:
Как показано на картинке выше, это классическая модель, управляемая весенными событиями, в том числе 3 роли: издатель событий, событие и слушатель. Соответствует Spring-Boot:
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!