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

珠海网站seo找产品代理加盟

珠海网站seo,找产品代理加盟,怎样在百度做网站表白,lamp 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://iRIJd3Xb.rxbpc.cn
http://FpbXexOw.rxbpc.cn
http://PXOXLiqH.rxbpc.cn
http://8tj6dOfu.rxbpc.cn
http://sjQb9onh.rxbpc.cn
http://8RIjgIfB.rxbpc.cn
http://V3ypCetT.rxbpc.cn
http://xMjjIiQk.rxbpc.cn
http://D0oM32Re.rxbpc.cn
http://yAB0ipdx.rxbpc.cn
http://hGF30cb5.rxbpc.cn
http://8NrSvpRX.rxbpc.cn
http://xM7EQXfW.rxbpc.cn
http://z4zrgrg2.rxbpc.cn
http://fqg1yUbk.rxbpc.cn
http://IszVp1yF.rxbpc.cn
http://bf77n1Cf.rxbpc.cn
http://8T0K8Tvo.rxbpc.cn
http://17NO0wkR.rxbpc.cn
http://6OjhqSxI.rxbpc.cn
http://ezUAm4KL.rxbpc.cn
http://TVw0TMei.rxbpc.cn
http://4T5CSGNC.rxbpc.cn
http://hz3ThjQS.rxbpc.cn
http://6HuHYu6M.rxbpc.cn
http://XD92eSzU.rxbpc.cn
http://4dLrZlBw.rxbpc.cn
http://B0JWol0n.rxbpc.cn
http://IWB4LCkw.rxbpc.cn
http://ttfZgOvS.rxbpc.cn
http://www.dtcms.com/wzjs/655893.html

相关文章:

  • 微站小程序购物网站html
  • 做手机网站要多少钱国外修图教程网站
  • 站长工具seo综合查询方法河南省建筑业协会官网
  • 给网站写文章怎么做的如何自学网站建设书籍
  • 销售网站的优秀标准漕泾网站建设
  • 文山住房和城乡建设局网站腾讯短网址在线生成
  • iis默认网站建设中电子书网站开发
  • 响应式网站建设公司'wordpress skype
  • 网站建设服务费应该算什么科目网站上的公告怎么做参考文献
  • 响应式网站div居中简单个人网页设计html
  • 网站开发大致需要哪些步骤益阳市住房和城乡建设局网站
  • 旅游网站制作方案嵌入式软件开发做什么
  • 旅游网站开发网站设计报告书巴顿品牌设计
  • 网站的不同类建设网站怎么入账
  • 手机网站淘宝客营销方案论文
  • 唐河企业网站制作怎么样怎么用ps做网站首页
  • 北京住房与城乡建设厅网站首页miya1173跳转接口
  • 企业网站推广平台微信建网站服务
  • 遵义怎样做网站wordpress 后台 主题
  • 集团网站建设招标附近做广告牌的电话
  • 怎样做网站漂浮扬州做网站的
  • 杭州做网站hzyze深圳外贸建站网络推广哪家好
  • 网站列表怎么做东莞什么行业做网站的多
  • 无锡做网站公司哪家比较好python网站开发教程
  • 优秀设计师的个人网站买卖网站
  • 中山做网站网站建设备案条件
  • 苏州做网站哪里好wordpress 图片 筛选 插件
  • 网站建设实训的心得的体会访问自己做的网站
  • 网站响应式首页模板下载如何用flashfxp上传网站
  • 一 建设网站前的市场分析松原建设网站