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

广州建网站兴田德润可信seo技术优化

广州建网站兴田德润可信,seo技术优化,成都洛羽网络科技有限公司,wordpress 修改文章内容Spring Boot启动流程及源码实现深度解析 一、启动流程概述 Spring Boot的启动流程围绕SpringApplication类展开,核心流程可分为以下几个阶段: 初始化阶段:推断应用类型,加载ApplicationContextInitializer和ApplicationListene…

Spring Boot启动流程及源码实现深度解析

一、启动流程概述

Spring Boot的启动流程围绕SpringApplication类展开,核心流程可分为以下几个阶段:

  1. 初始化阶段:推断应用类型,加载ApplicationContextInitializerApplicationListener
  2. 环境准备:加载配置文件和命令行参数
  3. 上下文创建:实例化ApplicationContext
  4. 上下文刷新:执行refresh()方法完成Bean加载
  5. 后置处理:执行CommandLineRunnerApplicationRunner

二、源码解析

1. 入口类

@SpringBootApplication
public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}
}

2. SpringApplication初始化

// SpringApplication.java
public static ConfigurableApplicationContext run(Class<?> primarySource, String... args) {return new SpringApplication(primarySource).run(args);
}public SpringApplication(Class<?>... primarySources) {this(null, primarySources);
}private SpringApplication(ResourceLoader resourceLoader, Class<?>... primarySources) {this.resourceLoader = resourceLoader;this.primarySources = new LinkedHashSet<>(Arrays.asList(primarySources));this.webApplicationType = WebApplicationType.deduceFromClasspath(); // 推断应用类型setInitializers((Collection) getSpringFactoriesInstances(ApplicationContextInitializer.class)); // 加载InitializerssetListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class)); // 加载Listenersthis.mainApplicationClass = deduceMainApplicationClass();
}

关键步骤解析

  • deduceFromClasspath()通过类路径判断应用类型(Servlet/Reactive/None)
  • META-INF/spring.factories加载初始化器和监听器

3. run()方法核心流程

public ConfigurableApplicationContext run(String... args) {StopWatch stopWatch = new StopWatch();stopWatch.start();ConfigurableApplicationContext context = null;SpringApplicationRunListeners listeners = getRunListeners(args);listeners.starting();try {ApplicationArguments applicationArguments = new DefaultApplicationArguments(args);ConfigurableEnvironment environment = prepareEnvironment(listeners, applicationArguments);configureIgnoreBeanInfo(environment);Banner printedBanner = printBanner(environment);// 创建应用上下文context = createApplicationContext();context.setEnvironment(environment);// 准备上下文prepareContext(context, environment, listeners, applicationArguments, printedBanner);// 刷新上下文(核心)refreshContext(context);// 后置处理afterRefresh(context, applicationArguments);stopWatch.stop();// 发布启动完成事件listeners.started(context);callRunners(context, applicationArguments);} catch (Throwable ex) {handleRunFailure(context, ex, listeners);throw new IllegalStateException(ex);}listeners.running(context);return context;
}

三、关键阶段详解

1. 环境准备(prepareEnvironment)

private ConfigurableEnvironment prepareEnvironment(SpringApplicationRunListeners listeners,ApplicationArguments applicationArguments) {ConfigurableEnvironment environment = getOrCreateEnvironment();configureEnvironment(environment, applicationArguments.getSourceArgs());ConfigurationPropertySources.attach(environment);listeners.environmentPrepared(environment); // 发布环境准备事件bindToSpringApplication(environment);return environment;
}
  • 加载application.properties/yml文件
  • 处理命令行参数--开头的参数
  • 触发ApplicationEnvironmentPreparedEvent事件

2. 上下文创建(createApplicationContext)

根据应用类型创建不同的上下文:

protected ConfigurableApplicationContext createApplicationContext() {return this.applicationContextFactory.create(this.webApplicationType);
}// 默认实现
ApplicationContextFactory DEFAULT = (webApplicationType) -> {try {switch (webApplicationType) {case SERVLET:return new AnnotationConfigServletWebServerApplicationContext();case REACTIVE:return new AnnotationConfigReactiveWebServerApplicationContext();default:return new AnnotationConfigApplicationContext();}} catch (Exception ex) {throw new IllegalStateException(...);}
};

3. 上下文刷新(refreshContext)

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) {((AbstractApplicationContext) applicationContext).refresh();
}

最终调用AbstractApplicationContext.refresh(),这是Spring容器的核心方法:

public void refresh() throws BeansException, IllegalStateException {synchronized (this.startupShutdownMonitor) {prepareRefresh();ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();prepareBeanFactory(beanFactory);// ... [省略其他步骤]finishRefresh(); // 触发ContextRefreshedEvent}
}

四、关键扩展点

1. ApplicationContextInitializer

public interface ApplicationContextInitializer<C extends ConfigurableApplicationContext> {void initialize(C applicationContext);
}
  • 执行时机:上下文准备阶段(prepareContext)
  • 配置方式:通过spring.factoriesSpringApplication.addInitializers()

2. ApplicationRunner/CommandLineRunner

@Component
public class DemoRunner implements ApplicationRunner {@Overridepublic void run(ApplicationArguments args) {// 应用启动后执行}
}
  • 执行顺序:通过@Order注解控制
  • 执行时机:上下文刷新完成后

五、总结

Spring Boot的启动流程通过智能的自动配置和扩展机制,显著简化了Spring应用的初始化过程。理解其核心流程和关键扩展点,可以帮助开发者:

  1. 深入排查启动过程中的问题
  2. 实现自定义的初始化逻辑
  3. 优化应用启动性能
  4. 扩展框架的核心功能

建议结合源码调试工具,通过断点跟踪SpringApplication.run()的执行过程,可以更直观地理解各阶段的实现细节。


流程图文字描述

main()
└─▶ SpringApplication.run()├─▶ 初始化应用类型和扩展组件├─▶ 准备环境(加载配置)├─▶ 创建ApplicationContext├─▶ 准备上下文(Bean定义加载)├─▶ 刷新上下文(Bean初始化)├─▶ 执行Runner接口└─▶ 完成启动

通过以上分析,读者可以系统地掌握Spring Boot的启动机制及其实现原理。实际开发中可结合具体需求,合理使用扩展点进行定制化开发。

http://www.dtcms.com/wzjs/507617.html

相关文章:

  • 站长联盟关键词查询工具有哪些
  • 微网站可以自己做吗谷歌独立站seo
  • 如何做授权网站软文营销的宗旨是什么
  • 珠海专业制作网站小时seo加盟
  • 日本做暖暖免费网站营销手段
  • 营销型网站建设评价上海站群优化
  • hexo框架做网站沈阳沈河seo网站排名优化
  • 找人 做网站 一般注意怎么注册百度账号
  • 长沙做网站建设优秀营销软文范例300字
  • 网站建设谈单思路营销渠道名词解释
  • 丰台广州网站建设中文域名的网站
  • 网站设计用什么软件做免费网站排名优化在线
  • 单片机项目外包网站什么是seo关键词
  • 佳木斯 网站建设优化技术基础
  • 成都专业网站建设优化团队百度客服电话4001056
  • 一级a做爰片软件网站制作网页教程
  • 注册个体可以做网站吗b2b免费发布平台
  • 网站cms相关知识网络推广代理平台
  • 400网站推广爱站网关键词查询工具
  • 宁波网站开发制作重庆网页优化seo
  • 成都手机网站建设开发郑州网站设计
  • 宁波网站设计方案全网最全搜索引擎app
  • wordpress 地址转换南京seo网络优化公司
  • FPGA毕业设计代做网站湖南最新消息今天
  • 网站建设谈单情景对话sem推广软件哪家好
  • 做网站优化有必要搜索引擎技术优化
  • wordpress用户中心汉化seo学校
  • 关于建设网站业务系统的请示济南网络seo公司
  • 免费做网站手机软件温州云优化seo
  • 卖渔具的亲戚做网站百度的网站