当前位置: 首页 > news >正文

网站建设一条龙全包seo专业婚纱摄影网站制作

网站建设一条龙全包seo,专业婚纱摄影网站制作,wordpress自动同步,长沙免费建站模板本篇将详细讨论Spring Boot 的启动/加载、处理请求的具体流程。我们先从一个简单的Spring Boot项目日志开始分析#xff08;这里假设读者已经仔细阅读完了前面的文章#xff0c;且对Spring源码有一定深度的了解#xff0c;否则会看得一脸懵逼#xff09;。 本文为2024重置…本篇将详细讨论Spring Boot 的启动/加载、处理请求的具体流程。我们先从一个简单的Spring Boot项目日志开始分析这里假设读者已经仔细阅读完了前面的文章且对Spring源码有一定深度的了解否则会看得一脸懵逼。 本文为2024重置版基于JDK8、Spring Boot 2.2.6.RELEASE最初版本基于Spring MVC XML配置现已废弃去除。 一、相关代码 1、pom.xml ?xml version1.0 encodingUTF-8? project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsdparentgroupIdsite.xiaokui/groupIdartifactIdk-2019/artifactIdversion1.0.0/version/parentmodelVersion4.0.0/modelVersionartifactIdk-mini/artifactIddependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependency/dependencies /project2、相关类 SpringBootApplication public class MiniAppRunner {public static void main(String[] args) {SpringApplication.run(MiniAppRunner.class, args);} }Slf4j RequiredArgsConstructor RestController public class TestController {PostMapping(/test)ResponseBodypublic Object test0(RequestBody MapString, Object map) {log.info(前端传来数据: map);return map;} }POST http://127.0.0.1:7077/test?aa1bb2 Content-Type: application/json{data: {login_type: 08,login_str: abcd} }3、相关配置 debug: trueserver:port: 7077logging:level.root: tracelevel.org.apache.tomcat: infolevel.sun.rmi: info以上为相关测试代码读者也可搭建环境自行测试省略具体输出日志。 二、SpringApplication 1、构造方法 // main方法入口来自类 SpringApplication public static ConfigurableApplicationContext run(Class? primarySource, String... args) {return run(new Class?[] { primarySource }, args); }public static ConfigurableApplicationContext run(Class?[] primarySources, String[] args) {return new SpringApplication(primarySources).run(args); }public SpringApplication(Class?... primarySources) {this(null, primarySources); }public SpringApplication(ResourceLoader resourceLoader, Class?... primarySources) {this.resourceLoader resourceLoader;Assert.notNull(primarySources, PrimarySources must not be null);this.primarySources new LinkedHashSet(Arrays.asList(primarySources));// 判断当前运行环境可选 none、servlet、reactivethis.webApplicationType WebApplicationType.deduceFromClasspath();// 读取 META-INF/spring.factories加载相关启动类// 加载初始化相关类共有7个 5 2数字刚好与下文的两份 spring.factories对上// 注意这里只是设置还尚未开始调用setInitializers((Collection) getSpringFactoriesInstances(ApplicationContextInitializer.class));// 加载监听器监听相关事件共有11个 10 1setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class));// 寻找main方法所在的类作为主类this.mainApplicationClass deduceMainApplicationClass(); }2、spring.factories 来自jar包 org.springframework.boot:spring-boot:2.2.6.REALEASE。 # 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# Error Reporters org.springframework.boot.SpringBootExceptionReporter\ org.springframework.boot.diagnostics.FailureAnalyzers# Application Context Initializers5个 org.springframework.context.ApplicationContextInitializer\ org.springframework.boot.context.ConfigurationWarningsApplicationContextInitializer,\ org.springframework.boot.context.ContextIdApplicationContextInitializer,\ org.springframework.boot.context.config.DelegatingApplicationContextInitializer,\ org.springframework.boot.rsocket.context.RSocketPortInfoApplicationContextInitializer,\ org.springframework.boot.web.context.ServerPortInfoApplicationContextInitializer# Application Listeners10个 org.springframework.context.ApplicationListener\ org.springframework.boot.ClearCachesApplicationListener,\ org.springframework.boot.builder.ParentContextCloserApplicationListener,\ org.springframework.boot.cloud.CloudFoundryVcapEnvironmentPostProcessor,\ 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.context.logging.ClasspathLoggingApplicationListener,\ org.springframework.boot.context.logging.LoggingApplicationListener,\ org.springframework.boot.liquibase.LiquibaseServiceLocatorApplicationListener# Environment Post Processors org.springframework.boot.env.EnvironmentPostProcessor\ org.springframework.boot.cloud.CloudFoundryVcapEnvironmentPostProcessor,\ org.springframework.boot.env.SpringApplicationJsonEnvironmentPostProcessor,\ org.springframework.boot.env.SystemEnvironmentPropertySourceEnvironmentPostProcessor,\ org.springframework.boot.reactor.DebugAgentEnvironmentPostProcessor# Failure Analyzers org.springframework.boot.diagnostics.FailureAnalyzer\ org.springframework.boot.diagnostics.analyzer.BeanCurrentlyInCreationFailureAnalyzer,\ org.springframework.boot.diagnostics.analyzer.BeanDefinitionOverrideFailureAnalyzer,\ org.springframework.boot.diagnostics.analyzer.BeanNotOfRequiredTypeFailureAnalyzer,\ org.springframework.boot.diagnostics.analyzer.BindFailureAnalyzer,\ org.springframework.boot.diagnostics.analyzer.BindValidationFailureAnalyzer,\ org.springframework.boot.diagnostics.analyzer.UnboundConfigurationPropertyFailureAnalyzer,\ org.springframework.boot.diagnostics.analyzer.ConnectorStartFailureAnalyzer,\ org.springframework.boot.diagnostics.analyzer.NoSuchMethodFailureAnalyzer,\ org.springframework.boot.diagnostics.analyzer.NoUniqueBeanDefinitionFailureAnalyzer,\ org.springframework.boot.diagnostics.analyzer.PortInUseFailureAnalyzer,\ org.springframework.boot.diagnostics.analyzer.ValidationExceptionFailureAnalyzer,\ org.springframework.boot.diagnostics.analyzer.InvalidConfigurationPropertyNameFailureAnalyzer,\ org.springframework.boot.diagnostics.analyzer.InvalidConfigurationPropertyValueFailureAnalyzer# FailureAnalysisReporters org.springframework.boot.diagnostics.FailureAnalysisReporter\ org.springframework.boot.diagnostics.LoggingFailureAnalysisReporter来自来自jar包 org.springframework.boot:spring-boot-autoconfigure:2.2.6.REALEASE。 # Initializers2个 org.springframework.context.ApplicationContextInitializer\ org.springframework.boot.autoconfigure.SharedMetadataReaderFactoryContextInitializer,\ org.springframework.boot.autoconfigure.logging.ConditionEvaluationReportLoggingListener# Application Listeners1个 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.OnBeanCondition,\ org.springframework.boot.autoconfigure.condition.OnClassCondition,\ org.springframework.boot.autoconfigure.condition.OnWebApplicationCondition# 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.CloudServiceConnectorsAutoConfiguration,\ 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.CassandraReactiveDataAutoConfiguration,\ org.springframework.boot.autoconfigure.data.cassandra.CassandraReactiveRepositoriesAutoConfiguration,\ org.springframework.boot.autoconfigure.data.cassandra.CassandraRepositoriesAutoConfiguration,\ org.springframework.boot.autoconfigure.data.couchbase.CouchbaseDataAutoConfiguration,\ org.springframework.boot.autoconfigure.data.couchbase.CouchbaseReactiveDataAutoConfiguration,\ org.springframework.boot.autoconfigure.data.couchbase.CouchbaseReactiveRepositoriesAutoConfiguration,\ 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.elasticsearch.ReactiveElasticsearchRepositoriesAutoConfiguration,\ org.springframework.boot.autoconfigure.data.elasticsearch.ReactiveRestClientAutoConfiguration,\ org.springframework.boot.autoconfigure.data.jdbc.JdbcRepositoriesAutoConfiguration,\ org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration,\ org.springframework.boot.autoconfigure.data.ldap.LdapRepositoriesAutoConfiguration,\ org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration,\ org.springframework.boot.autoconfigure.data.mongo.MongoReactiveDataAutoConfiguration,\ org.springframework.boot.autoconfigure.data.mongo.MongoReactiveRepositoriesAutoConfiguration,\ 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.RedisReactiveAutoConfiguration,\ 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.elasticsearch.rest.RestClientAutoConfiguration,\ org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration,\ 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.http.HttpMessageConvertersAutoConfiguration,\ org.springframework.boot.autoconfigure.http.codec.CodecsAutoConfiguration,\ org.springframework.boot.autoconfigure.influx.InfluxDbAutoConfiguration,\ 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.groovy.template.GroovyTemplateAutoConfiguration,\ org.springframework.boot.autoconfigure.jersey.JerseyAutoConfiguration,\ org.springframework.boot.autoconfigure.jooq.JooqAutoConfiguration,\ org.springframework.boot.autoconfigure.jsonb.JsonbAutoConfiguration,\ 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.mongo.embedded.EmbeddedMongoAutoConfiguration,\ org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration,\ org.springframework.boot.autoconfigure.mongo.MongoReactiveAutoConfiguration,\ org.springframework.boot.autoconfigure.mustache.MustacheAutoConfiguration,\ org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration,\ org.springframework.boot.autoconfigure.quartz.QuartzAutoConfiguration,\ org.springframework.boot.autoconfigure.rsocket.RSocketMessagingAutoConfiguration,\ org.springframework.boot.autoconfigure.rsocket.RSocketRequesterAutoConfiguration,\ org.springframework.boot.autoconfigure.rsocket.RSocketServerAutoConfiguration,\ org.springframework.boot.autoconfigure.rsocket.RSocketStrategiesAutoConfiguration,\ org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration,\ org.springframework.boot.autoconfigure.security.servlet.UserDetailsServiceAutoConfiguration,\ org.springframework.boot.autoconfigure.security.servlet.SecurityFilterAutoConfiguration,\ org.springframework.boot.autoconfigure.security.reactive.ReactiveSecurityAutoConfiguration,\ org.springframework.boot.autoconfigure.security.reactive.ReactiveUserDetailsServiceAutoConfiguration,\ org.springframework.boot.autoconfigure.security.rsocket.RSocketSecurityAutoConfiguration,\ org.springframework.boot.autoconfigure.security.saml2.Saml2RelyingPartyAutoConfiguration,\ org.springframework.boot.autoconfigure.sendgrid.SendGridAutoConfiguration,\ org.springframework.boot.autoconfigure.session.SessionAutoConfiguration,\ org.springframework.boot.autoconfigure.security.oauth2.client.servlet.OAuth2ClientAutoConfiguration,\ org.springframework.boot.autoconfigure.security.oauth2.client.reactive.ReactiveOAuth2ClientAutoConfiguration,\ org.springframework.boot.autoconfigure.security.oauth2.resource.servlet.OAuth2ResourceServerAutoConfiguration,\ org.springframework.boot.autoconfigure.security.oauth2.resource.reactive.ReactiveOAuth2ResourceServerAutoConfiguration,\ org.springframework.boot.autoconfigure.solr.SolrAutoConfiguration,\ org.springframework.boot.autoconfigure.task.TaskExecutionAutoConfiguration,\ org.springframework.boot.autoconfigure.task.TaskSchedulingAutoConfiguration,\ 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.client.RestTemplateAutoConfiguration,\ org.springframework.boot.autoconfigure.web.embedded.EmbeddedWebServerFactoryCustomizerAutoConfiguration,\ org.springframework.boot.autoconfigure.web.reactive.HttpHandlerAutoConfiguration,\ org.springframework.boot.autoconfigure.web.reactive.ReactiveWebServerFactoryAutoConfiguration,\ org.springframework.boot.autoconfigure.web.reactive.WebFluxAutoConfiguration,\ org.springframework.boot.autoconfigure.web.reactive.error.ErrorWebFluxAutoConfiguration,\ org.springframework.boot.autoconfigure.web.reactive.function.client.ClientHttpConnectorAutoConfiguration,\ org.springframework.boot.autoconfigure.web.reactive.function.client.WebClientAutoConfiguration,\ org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration,\ org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration,\ org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration,\ org.springframework.boot.autoconfigure.web.servlet.HttpEncodingAutoConfiguration,\ org.springframework.boot.autoconfigure.web.servlet.MultipartAutoConfiguration,\ org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration,\ org.springframework.boot.autoconfigure.websocket.reactive.WebSocketReactiveAutoConfiguration,\ org.springframework.boot.autoconfigure.websocket.servlet.WebSocketServletAutoConfiguration,\ org.springframework.boot.autoconfigure.websocket.servlet.WebSocketMessagingAutoConfiguration,\ org.springframework.boot.autoconfigure.webservices.WebServicesAutoConfiguration,\ org.springframework.boot.autoconfigure.webservices.client.WebServiceTemplateAutoConfiguration# Failure analyzers org.springframework.boot.diagnostics.FailureAnalyzer\ org.springframework.boot.autoconfigure.diagnostics.analyzer.NoSuchBeanDefinitionFailureAnalyzer,\ org.springframework.boot.autoconfigure.flyway.FlywayMigrationScriptMissingFailureAnalyzer,\ org.springframework.boot.autoconfigure.jdbc.DataSourceBeanCreationFailureAnalyzer,\ org.springframework.boot.autoconfigure.jdbc.HikariDriverConfigurationFailureAnalyzer,\ org.springframework.boot.autoconfigure.session.NonUniqueSessionRepositoryFailureAnalyzer# 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.servlet.JspTemplateAvailabilityProvider3、事件周期图 下图展现SpringApplication的事件全生命周期读者可以按照此图对照源码进行阅读。其中相关核心类有断点神类 SpringApplicationSimpleApplicationEventMulticaster 4、主干 // 主干逻辑 public ConfigurableApplicationContext run(String... args) {// 统计耗时StopWatch stopWatch new StopWatch();stopWatch.start();// WebApplicationContextConfigurableApplicationContext context null;CollectionSpringBootExceptionReporter exceptionReporters new ArrayList();// 设置无图形界面服务器工作模式configureHeadlessProperty();SpringApplicationRunListeners listeners getRunListeners(args);// 触发事件 ApplicationStartingEvent// 分别为 LoggingApplicationListener、BackgroundPreinitializer、DelegatingApplicationListener、LiquibaseServiceLocatorApplicationListener// 这里重点关注下 LoggingApplicationListener、BackgroundPreinitializerlisteners.starting();try {ApplicationArguments applicationArguments new DefaultApplicationArguments(args);// 准备环境包含各种系统属性、环境变量、配置值// 触发事件 ApplicationEnvironmentPreparedEventConfigurableEnvironment environment prepareEnvironment(listeners, applicationArguments);configureIgnoreBeanInfo(environment);Banner printedBanner printBanner(environment);// 创建 AnnotationConfigServletWebServerApplicationContextcontext createApplicationContext();exceptionReporters getSpringFactoriesInstances(SpringBootExceptionReporter.class,new Class[] { ConfigurableApplicationContext.class }, context);// 触发 applyInitializers// 触发事件 ApplicationContextInitializedEvent、ApplicationPreparedEventprepareContext(context, environment, listeners, applicationArguments, printedBanner);// 完成刷新触发事件 ContextRefreshedEvent、ServletWebServerInitializedEventrefreshContext(context);// 空实现留作扩展afterRefresh(context, applicationArguments// 完成统计耗时stopWatch.stop();if (this.logStartupInfo) {// 打印启动耗时// Started MiniAppRunner in 106.05 seconds (JVM running for 189.145)new StartupInfoLogger(this.mainApplicationClass).logStarted(getApplicationLog(), stopWatch);}// 触发事件 ApplicationStartedEventlisteners.started(context);// 调用 ApplicationRunner、CommandLineRunnercallRunners(context, applicationArguments);}catch (Throwable ex) {handleRunFailure(context, ex, exceptionReporters, listeners);throw new IllegalStateException(ex);}try {// 发布事件 ApplicationReadyEvent代表Spring已经完全启动了listeners.running(context);}catch (Throwable ex) {handleRunFailure(context, ex, exceptionReporters, null);throw new IllegalStateException(ex);}return context; }三、系统属性初始化 1、ApplicationStartingEvent 1、LoggingApplicationListener // 来自类 LoggingApplicationListener Override public void onApplicationEvent(ApplicationEvent event) {// 系统开始启动事件if (event instanceof ApplicationStartingEvent) {onApplicationStartingEvent((ApplicationStartingEvent) event);}else if (event instanceof ApplicationEnvironmentPreparedEvent) {onApplicationEnvironmentPreparedEvent((ApplicationEnvironmentPreparedEvent) event);}else if (event instanceof ApplicationPreparedEvent) {onApplicationPreparedEvent((ApplicationPreparedEvent) event);}else if (event instanceof ContextClosedEvent ((ContextClosedEvent) event).getApplicationContext().getParent() null) {onContextClosedEvent();}else if (event instanceof ApplicationFailedEvent) {onApplicationFailedEvent();} }private void onApplicationStartingEvent(ApplicationStartingEvent event) {// 准备 LoggingSystemthis.loggingSystem LoggingSystem.get(event.getSpringApplication().getClassLoader());// 日志系统初始化之前的准备工作this.loggingSystem.beforeInitialize(); }// 来自类 LoggingSystem Override public void beforeInitialize() {LoggerContext loggerContext getLoggerContext();if (isAlreadyInitialized(loggerContext)) {return;}// 会触发父类 Slf4JLoggingSystem 的初始化// 此步骤会尽量保证系统只有一个日志框架生效例如jdklog、logback、log4j只会生效一个super.beforeInitialize();loggerContext.getTurboFilterList().add(FILTER); }2、BackgroundPreinitializer // 来自类 BackgroundPreinitializer Override public void onApplicationEvent(SpringApplicationEvent event) {if (!Boolean.getBoolean(IGNORE_BACKGROUNDPREINITIALIZER_PROPERTY_NAME) event instanceof ApplicationStartingEvent multipleProcessors() preinitializationStarted.compareAndSet(false, true)) {performPreinitialization();}if ((event instanceof ApplicationReadyEvent || event instanceof ApplicationFailedEvent) preinitializationStarted.get()) {try {preinitializationComplete.await();}catch (InterruptedException ex) {Thread.currentThread().interrupt();}} }// 主要作用是执行类的预热因为组件较多提前异步实例化可提升系统启动速度 // 实例化好的对象最终会保存到一个静态对象中下次直接使用即可 private void performPreinitialization() {try {Thread thread new Thread(new Runnable() {Overridepublic void run() {runSafely(new ConversionServiceInitializer());runSafely(new ValidationInitializer());runSafely(new MessageConverterInitializer());runSafely(new JacksonInitializer());runSafely(new CharsetInitializer());preinitializationComplete.countDown();}public void runSafely(Runnable runnable) {try {runnable.run();}catch (Throwable ex) {// Ignore}}}, background-preinit);thread.start();}catch (Exception ex) {// This will fail on GAE where creating threads is prohibited. We can safely// continue but startup will be slightly slower as the initialization will now// happen on the main thread.preinitializationComplete.countDown();} }2、prepareEnvironment private ConfigurableEnvironment prepareEnvironment(SpringApplicationRunListeners listeners,ApplicationArguments applicationArguments) {// Create and configure the environment// 此时具有环境变量和系统属性但还未有配置文件属性ConfigurableEnvironment environment getOrCreateEnvironment();configureEnvironment(environment, applicationArguments.getSourceArgs());ConfigurationPropertySources.attach(environment);// 发布环境就绪事件// 会触发监听类 ConfigFileApplicationListener、AnsiOutputApplicationListener、LoggingApplicationListener// ClasspathLoggingApplicationListener、BackgroundPreinitializer、DelegatingApplicationListener、FileEncodingApplicationListenerlisteners.environmentPrepared(environment);bindToSpringApplication(environment);if (!this.isCustomEnvironment) {environment new EnvironmentConverter(getClassLoader()).convertEnvironmentIfNecessary(environment,deduceEnvironmentClass());}ConfigurationPropertySources.attach(environment);return environment; } 1、getOrCreateEnvironment private ConfigurableEnvironment getOrCreateEnvironment() {if (this.environment ! null) {return this.environment;}switch (this.webApplicationType) {// 走此逻辑case SERVLET:return new StandardServletEnvironment();case REACTIVE:return new StandardReactiveWebEnvironment();default:return new StandardEnvironment();} }public class StandardServletEnvironment extends StandardEnvironment implements ConfigurableWebEnvironment {}// 会首先触发父类的初始化 public AbstractEnvironment() {// 开始读取配置customizePropertySources(this.propertySources); }// 来自类 StandardServletEnvironment Override protected void customizePropertySources(MutablePropertySources propertySources) {propertySources.addLast(new StubPropertySource(SERVLET_CONFIG_PROPERTY_SOURCE_NAME));propertySources.addLast(new StubPropertySource(SERVLET_CONTEXT_PROPERTY_SOURCE_NAME));if (JndiLocatorDelegate.isDefaultJndiEnvironmentAvailable()) {propertySources.addLast(new JndiPropertySource(JNDI_PROPERTY_SOURCE_NAME));}// 回调父类 customizePropertySourcessuper.customizePropertySources(propertySources); }// 来自类 StandardEnvironment Override protected void customizePropertySources(MutablePropertySources propertySources) {// 底层为 (Map) System.getProperties()propertySources.addLast(new PropertiesPropertySource(SYSTEM_PROPERTIES_PROPERTY_SOURCE_NAME, getSystemProperties()));// 底层为 (Map) System.getenv()propertySources.addLast(new SystemEnvironmentPropertySource(SYSTEM_ENVIRONMENT_PROPERTY_SOURCE_NAME, getSystemEnvironment())); }2、ApplicationEnvironmentPreparedEvent 限于篇幅这里不详细展开大概列下 ConfigFileApplicationListener用于加载外部配置文件。AnsiOutputApplicationListener让你的终端可以是控制台、可以是日志文件支持Ansi彩色输出。LoggingApplicationListener初始化日志系统。ClasspathLoggingApplicationListener用于把classpath路径以log.debug()输出。BackgroundPreinitializer无动作。DelegatingApplicationListener执行通过外部化配置context.listener.classes xxx,xxx的监听器们然后把该事件广播给他们。FileEncodingApplicationListener检查文件编码file.encoding。 ConfigFileApplicationListener 部分关键代码如下 // 来自类 ConfigFileApplicationListener Override public void onApplicationEvent(ApplicationEvent event) {if (event instanceof ApplicationEnvironmentPreparedEvent) {onApplicationEnvironmentPreparedEvent((ApplicationEnvironmentPreparedEvent) event);}if (event instanceof ApplicationPreparedEvent) {onApplicationPreparedEvent(event);} }private void onApplicationEnvironmentPreparedEvent(ApplicationEnvironmentPreparedEvent event) {// 分别为 SystemEnvironmentPropertySourceEnvironmentPostProcessor、SpringApplicationJsonEnvironmentPostProcessor// CloudFoundryVcapEnvironmentPostProcessor、DebugAgentEnvironmentPostProcessorListEnvironmentPostProcessor postProcessors loadPostProcessors();// 注意 add this了// 读取外部配置这个最重要的活是自己来干postProcessors.add(this);AnnotationAwareOrderComparator.sort(postProcessors);for (EnvironmentPostProcessor postProcessor : postProcessors) {postProcessor.postProcessEnvironment(event.getEnvironment(), event.getSpringApplication());} }// 来自类 ConfigFileApplicationListener Override public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {addPropertySources(environment, application.getResourceLoader()); }// 鉴于代码较多这里只列举部分关键代码 // 默认配置文件路径 DEFAULT_SEARCH_LOCATIONS classpath:/,classpath:/config/,file:./,file:./config/; private void load(Profile profile, DocumentFilterFactory filterFactory, DocumentConsumer consumer) {getSearchLocations().forEach((location) - {boolean isFolder location.endsWith(/);SetString names isFolder ? getSearchNames() : NO_SEARCH_NAMES;names.forEach((name) - load(location, name, profile, filterFactory, consumer));}); }LoggingApplicationListener 部分关键代码如下 // 来自类 LoggingApplicationListener private void onApplicationEnvironmentPreparedEvent(ApplicationEnvironmentPreparedEvent event) {// 上一事件已经完成准备工作if (this.loggingSystem null) {this.loggingSystem LoggingSystem.get(event.getSpringApplication().getClassLoader());}// 直接跳到这里开始初始化initialize(event.getEnvironment(), event.getSpringApplication().getClassLoader()); }protected void initialize(ConfigurableEnvironment environment, ClassLoader classLoader) {// 设置日志属性默认值new LoggingSystemProperties(environment).apply();// 日志文件名 logging.file.name、logging.file// 日志文件路径 logging.file.path、logging.paththis.logFile LogFile.get(environment);if (this.logFile ! null) {this.logFile.applyToSystemProperties();}// 默认logger web sqlthis.loggerGroups new LoggerGroups(DEFAULT_GROUP_LOGGERS);// 设置early日志级别主要是 debug/trace true/falseinitializeEarlyLoggingLevel(environment);// 根据日志配置初始化日志系统包括 日志输出格式、日志存放路径、日志存放策略等initializeSystem(environment, this.loggingSystem, this.logFile);// 设置日志级别含root和各个子包路径initializeFinalLoggingLevels(environment, this.loggingSystem);// 注册销毁钩子registerShutdownHookIfNecessary(environment, this.loggingSystem); }3、printBanner 打印banner关键类为 SpringApplicationBannerPrinter这里不做详细展开。 // 只列举部分字段 class SpringApplicationBannerPrinter {static final String BANNER_LOCATION_PROPERTY spring.banner.location;static final String BANNER_IMAGE_LOCATION_PROPERTY spring.banner.image.location;static final String DEFAULT_BANNER_LOCATION banner.txt;static final String[] IMAGE_EXTENSION { gif, jpg, png };// 默认打印 spring boot 版本信息private static final Banner DEFAULT_BANNER new SpringBootBanner();private final ResourceLoader resourceLoader;private final Banner fallbackBanner;// 其他略 }四、WebApplication初始化 1、createApplicationContext // 来自类 SpringApplication protected ConfigurableApplicationContext createApplicationContext() {Class? contextClass this.applicationContextClass;if (contextClass null) {try {switch (this.webApplicationType) {case SERVLET:// 走此逻辑类为 AnnotationConfigServletWebServerApplicationContextcontextClass Class.forName(DEFAULT_SERVLET_WEB_CONTEXT_CLASS);break;case REACTIVE:// AnnotationConfigReactiveWebServerApplicationContextcontextClass Class.forName(DEFAULT_REACTIVE_WEB_CONTEXT_CLASS);break;default:// AnnotationConfigApplicationContext contextClass Class.forName(DEFAULT_CONTEXT_CLASS);}}catch (ClassNotFoundException ex) {throw new IllegalStateException(Unable create a default ApplicationContext, please specify an ApplicationContextClass, ex);}}return (ConfigurableApplicationContext) BeanUtils.instantiateClass(contextClass); }2、prepareContext private void prepareContext(ConfigurableApplicationContext context, ConfigurableEnvironment environment,SpringApplicationRunListeners listeners, ApplicationArguments applicationArguments, Banner printedBanner) {context.setEnvironment(environment);postProcessApplicationContext(context);// 触发初始化逻辑共7个具体参见前文applyInitializers(context);// 发布事件 ApplicationContextInitializedEventlisteners.contextPrepared(context);if (this.logStartupInfo) {logStartupInfo(context.getParent() null);logStartupProfileInfo(context);}// Add boot specific singleton beansConfigurableListableBeanFactory beanFactory context.getBeanFactory();beanFactory.registerSingleton(springApplicationArguments, applicationArguments);if (printedBanner ! null) {beanFactory.registerSingleton(springBootBanner, printedBanner);}if (beanFactory instanceof DefaultListableBeanFactory) {((DefaultListableBeanFactory) beanFactory).setAllowBeanDefinitionOverriding(this.allowBeanDefinitionOverriding);}if (this.lazyInitialization) {context.addBeanFactoryPostProcessor(new LazyInitializationBeanFactoryPostProcessor());}// Load the sourcesSetObject sources getAllSources();Assert.notEmpty(sources, Sources must not be empty);load(context, sources.toArray(new Object[0]));// 发布 ApplicationPreparedEventlisteners.contextLoaded(context); } 1、applyInitializers // 触发相关类为 DelegatingApplicationContextInitializer、SharedMetadataReaderFactoryContextInitializer、ContextIdApplicationContextInitializer // ConfigurationWarningsApplicationContextInitializer、RSocketPortInfoApplicationContextInitializer // ServerPortInfoApplicationContextInitializer、ConditionEvaluationReportLoggingListener protected void applyInitializers(ConfigurableApplicationContext context) {for (ApplicationContextInitializer initializer : getInitializers()) {Class? requiredType GenericTypeResolver.resolveTypeArgument(initializer.getClass(),ApplicationContextInitializer.class);Assert.isInstanceOf(requiredType, context, Unable to call initializer.);initializer.initialize(context);} }2、contextPrepared // 来自类 SpringApplicationRunListeners // 发布WebApplication就绪事件 void contextPrepared(ConfigurableApplicationContext context) {for (SpringApplicationRunListener listener : this.listeners) {listener.contextPrepared(context);} }// 来自类 EventPublishingRunListener Override public void contextPrepared(ConfigurableApplicationContext context) {this.initialMulticaster.multicastEvent(new ApplicationContextInitializedEvent(this.application, this.args, context)); } 3、contextLoaded // 来自类 SpringApplicationRunListeners // 发布WebApplication加载完毕事件 void contextLoaded(ConfigurableApplicationContext context) {for (SpringApplicationRunListener listener : this.listeners) {listener.contextLoaded(context);} }// 来自类 EventPublishingRunListener Override public void contextLoaded(ConfigurableApplicationContext context) {for (ApplicationListener? listener : this.application.getListeners()) {if (listener instanceof ApplicationContextAware) {((ApplicationContextAware) listener).setApplicationContext(context);}context.addApplicationListener(listener);}this.initialMulticaster.multicastEvent(new ApplicationPreparedEvent(this.application, this.args, context)); } 3、refreshContext // 来自类 SpringApplication 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(); }public CollectionApplicationListener? getApplicationListeners() {return this.applicationListeners; }// 来自类 AbstractApplicationContext Override public void refresh() throws BeansException, IllegalStateException {synchronized (this.startupShutdownMonitor) {// Prepare this context for refreshing.prepareRefresh();// Tell the subclass to refresh the internal bean factory.ConfigurableListableBeanFactory beanFactory obtainFreshBeanFactory();// Prepare the bean factory for use in this context.prepareBeanFactory(beanFactory);try {// Allows post-processing of the bean factory in context subclasses.postProcessBeanFactory(beanFactory);// Invoke factory processors registered as beans in the context.invokeBeanFactoryPostProcessors(beanFactory);// Register bean processors that intercept bean creation.registerBeanPostProcessors(beanFactory);// Initialize message source for this context.initMessageSource();// Initialize event multicaster for this context.initApplicationEventMulticaster();// Initialize other special beans in specific context subclasses.onRefresh();// Check for listener beans and register them.registerListeners();// Instantiate all remaining (non-lazy-init) singletons.finishBeanFactoryInitialization(beanFactory);// Last step: publish corresponding event.// 发布 ContextRefreshedEvent、ServletWebServerInitializedEvent 事件// 会有一次 super.finishRefreshfinishRefresh();}catch (BeansException ex) {if (logger.isWarnEnabled()) {logger.warn(Exception encountered during context initialization - cancelling refresh attempt: ex);}// Destroy already created singletons to avoid dangling resources.destroyBeans();// Reset active flag.cancelRefresh(ex);// Propagate exception to caller.throw ex;}finally {// Reset common introspection caches in Springs core, since we// might not ever need metadata for singleton beans anymore...resetCommonCaches();}} }刷新完后的 AnnotationConfigServletWebServerApplicationContext 将完全具有 BeanFactory 和 ApplicationContext 的功能剩下的就是一些收尾工作。 在完成刷新之后会发布 ContextRefreshedEvent、ServletWebServerInitializedEvent 事件。 4、callRunners 我们可以在Spring完全启动后通过实现 ApplicationRunner、CommandLineRunner 接口做一些事情。 private void callRunners(ApplicationContext context, ApplicationArguments args) {ListObject runners new ArrayList();runners.addAll(context.getBeansOfType(ApplicationRunner.class).values());runners.addAll(context.getBeansOfType(CommandLineRunner.class).values());AnnotationAwareOrderComparator.sort(runners);for (Object runner : new LinkedHashSet(runners)) {if (runner instanceof ApplicationRunner) {callRunner((ApplicationRunner) runner, args);}if (runner instanceof CommandLineRunner) {callRunner((CommandLineRunner) runner, args);}} }再最后就是发布 ApplicationReadyEvent代表Spring已经完全启动了。 至此Spring Boot相关源码已梳理完毕下篇将着重分析Spring是如何处理一个请求的。
http://www.w-s-a.com/news/189436/

相关文章:

  • 在网站做推广要钱吗网站根目录是哪个文件夹
  • 网站建设如何弄链接海外vps一键配置WordPress
  • 1个ip可以做几个网站吗动画制作可以自学吗
  • 顺德建设局网站如何搭建网站
  • 精品网站建设费用 干净磐石网络网页制作简单作业
  • 网站建设需要用软件群晖怎样做网站
  • 网站建设公司有哪博客网站建设方案书
  • 服装商城的网站建设宿迁论坛
  • 网站建设服务市场趋势淮南市网站开发的方式
  • 交互设计包含网站设计wordpress和discuz共存
  • 淮阳城乡建设局网站在线网页翻译软件
  • 什么是电商视觉设计郑州seo服务
  • google网站设计原则青海网站建设与管理
  • 简述网站的创建流程广西网站建设定制
  • 唐河网站制作汉中建设工程招标新闻中心
  • 网站过期就可以抢注PHP框架和wordpress
  • 天津做网站得公司克隆网站到wordpress修改
  • 郫县网站建设网站建设报价单及项目收费明细表
  • 商标做网站logo建网站作业
  • 网站顶部展出的大幅广告中建八局第二建设有限公司
  • 公众微信绑定网站帐号优秀中文网页设计
  • 如何做漫画赚钱的网站企业网站管理系统c
  • 安康公司网站制作搜狗网站
  • 太仓住房与城乡建设局网站注册推广赚钱一个80元
  • wordpress 网站生成app企业网站改版的好处
  • 广州建站服务怎么让客户做网站
  • 南京手机网站设计公司wordpress导航页
  • 娄底市建设网站app网站开发小程序
  • 刷粉网站推广免费网站建设找王科杰信誉
  • 投标建设用地是哪个网站微信小程序多少钱