SpringApplication
的职责是建立一个ApplicationContext
SpringFactoriesLoader
加载相似于SPI机制
Spring会去找META-INF/spring.factories
文件(文件存在多个),找到对应的实现类的全类名进行加载java
建立
ApplicationContext`的过程SpringApplication.initialize()
javax.servlet.Servlet
org.springframework.web.context.ConfigurableWebApplicationContext
spring会去判断这俩个类是否都存在,都存在的话就会设置webEnvironment为Trueweb
ApplicationContextInitializer
经过SpringFactoriesLoader加载机制,将 org.springframework.context.ApplicationContextInitializer
对应的Context进行加载 > org.springframework.boot.autoconfigure.SharedMetadataReaderFactoryContextInitializer
> org.springframework.boot.autoconfigure.logging.AutoConfigurationReportLoggingInitializer
> org.springframework.boot.context.ConfigurationWarningsApplicationContextInitializer
> org.springframework.boot.context.ContextIdApplicationContextInitializer
> org.springframework.boot.context.config.DelegatingApplicationContextInitializer
> org.springframework.boot.context.embedded.ServerPortInfoApplicationContextInitializer
spring
Listener
经过SpringFactoriesLoader加载机制,将org.springframework.context.ApplicationListener
对应的Listener进行加载bootstrap
org.springframework.boot.autoconfigure.BackgroundPreinitializer
org.springframework.cloud.bootstrap.BootstrapApplicationListener
org.springframework.cloud.bootstrap.LoggingSystemShutdownListener
org.springframework.cloud.context.restart.RestartListener
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
ui
Spring会拿当前线程的堆栈信息,而后遍历堆栈中的方法帧,查看是否有方法名等于main的方法帧spa
SpringApplication.run()
SpringApplicationRunListener
SpringApplicationRunListener
会在在SpringApplication
的run()
方法中建立ApplicationContext
的各个步骤作相应的处理SpringApplicationRunListeners
是SpringApplicationRunListener
的集合类SpringApplicationRunListeners
类负责管理在SpringApplication
的run()
方法中建立ApplicationContext
的各个步骤,一共有5个步骤,starting()
->environmentPrepared()
->contextPrepared()
->contextLoaded()
->finished()
,在每一个步骤中会调用具体的SpringApplicationRunListener
实现类去作相应的事情命令行
经过SpringFactoriesLoader加载机制,将org.springframework.boot.SpringApplicationRunListener
对应的SpringApplicationRunListener
进行加载线程
EventPublishingRunListener
rest
SpringApplicationRunListeners.start()
方法 在该方法中利用了SpringApplicationRunListener
实现类EventPublishingRunListener
向ApplicationListener
实现类广播了ApplicationStartedEvent
事件响应了
ApplicationStartedEvent
事件的ApplicationListener
org.springframework.boot.logging.LoggingApplicationListener
org.springframework.boot.context.config.DelegatingApplicationListener
org.springframework.boot.liquibase.LiquibaseServiceLocatorApplicationListener
code
Environment
以及对Environment
进行相应的配置
Environment
接口表明Spring应用的上下文环境,保存了Spring应用的配置文件和系统属性
Environment
会根据是否在Web环境上示例化对应Environment
实现类,若是是Web环境,就建立StandardServletEnvironment
,不是则建立StandardEnvironment
,StandardServletEnvironment
对Servlet
、JNDI
的属性进行了设置Environment
当中,具体方法SpringApplication.configurePropertySources()
能够利用
SpringApplication.addCommandLineProperties
属性对命令行参数进行禁用
Environment
的activeProfiles
,从spring.profiles.active
属性中读取SpringApplicationRunListeners.environmentPrepared()
方法 在该方法中利用了SpringApplicationRunListener
实现类EventPublishingRunListener
向ApplicationListener
实现类广播了ApplicationEnvironmentPreparedEvent
事件 >响应了ApplicationEnvironmentPreparedEvent
事件的ApplicationListener
>org.springframework.cloud.bootstrap.BootstrapApplicationListener
>org.springframework.cloud.bootstrap.LoggingSystemShutdownListener
>org.springframework.boot.context.config.ConfigFileApplicationListener
>org.springframework.boot.context.config.AnsiOutputApplicationListener
>org.springframework.boot.logging.LoggingApplicationListener
>org.springframework.boot.autoconfigure.BackgroundPreinitializer
>org.springframework.boot.logging.ClasspathLoggingApplicationListener
>org.springframework.boot.context.config.DelegatingApplicationListener
>org.springframework.boot.context.FileEncodingApplicationListener
ApplicationContext
以及对ApplicationContext
进行相应的配置ApplicationContext
会根据是否在Web环境上示例化对应ApplicationContext
实现类,若是是Web环境,就建立AnnotationConfigEmbeddedWebApplicationContext
,不是则建立AnnotationConfigApplicationContext
。Environment
设置进ApplicationContext
ApplicationContext
进行前置处理 若是指定了BeanNameGenerator
和ResourceLoader
,会设置到ApplicationContext
ApplicationContextInitializer
org.springframework.cloud.bootstrap.BootstrapApplicationListener$AncestorInitializer
org.springframework.cloud.bootstrap.BootstrapApplicationListener$DelegatingEnvironmentDecryptApplicationInitializer
org.springframework.cloud.bootstrap.config.PropertySourceBootstrapConfiguration$$EnhancerBySpringCGLIB$$d551191c
org.springframework.cloud.bootstrap.encrypt.EnvironmentDecryptApplicationInitializer
org.springframework.boot.context.config.DelegatingApplicationContextInitializer
org.springframework.boot.context.ContextIdApplicationContextInitializer
org.springframework.boot.autoconfigure.SharedMetadataReaderFactoryContextInitializer
org.springframework.boot.autoconfigure.logging.AutoConfigurationReportLoggingInitializer
org.springframework.boot.context.ConfigurationWarningsApplicationContextInitializer
org.springframework.boot.context.embedded.ServerPortInfoApplicationContextInitializer
SpringApplicationRunListeners.contextPrepared()
方法bean
,DefaultApplicationArguments
sources
到ApplicationContext
SpringApplicationRunListeners.contextLoaded()
方法 在这一步首先会将如今的ApplicationListener
注册到ApplicationContext
当中,而后再利用了SpringApplicationRunListener
实现类EventPublishingRunListener
向ApplicationListener
实现类广播了ApplicationPreparedEvent
事件添加到
ApplicationContext
的ApplicationListener
org.springframework.cloud.bootstrap.BootstrapApplicationListener
org.springframework.cloud.bootstrap.LoggingSystemShutdownListener
org.springframework.boot.context.config.ConfigFileApplicationListener
org.springframework.boot.context.config.AnsiOutputApplicationListener
org.springframework.boot.logging.LoggingApplicationListener
org.springframework.boot.autoconfigure.BackgroundPreinitializer
org.springframework.boot.logging.ClasspathLoggingApplicationListener
org.springframework.cloud.context.restart.RestartListener
org.springframework.boot.context.config.DelegatingApplicationListener
org.springframework.boot.builder.ParentContextCloserApplicationListener
org.springframework.boot.ClearCachesApplicationListener
org.springframework.boot.context.FileEncodingApplicationListener
org.springframework.boot.liquibase.LiquibaseServiceLocatorApplicationListener
响应了ApplicationPreparedEvent
事件的ApplicationListener
org.springframework.boot.context.config.ConfigFileApplicationListener
org.springframework.boot.logging.LoggingApplicationListener
org.springframework.cloud.context.restart.RestartListener
org.springframework.boot.context.config.DelegatingApplicationListener
refreshContext()
afterRefresh()
执行实现了ApplicationRunner
和CommandLineRunner
的beanSpringApplicationRunListeners.finished()
方法