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容器の起动に関する知识です。皆さんに助けてほしいです。もし何か疑问があれば、メッセージをください。小编はすぐに皆さんに返事します。ここでも私たちのサイトを応援してくれてありがとうございます。