SpringBoot运行源码分析:Spring应用上下文刷新,JSP计算机毕设项目

文章详细描述了SpringBoot应用启动时如何初始化上下文、事件监听器和容器生命周期处理器,强调了ApplicationRunner和CommandLineRunner接口在容器启动时执行自定义操作的重要性,以及它们的区别和使用场景。
摘要由CSDN通过智能技术生成

//初始化 context 的信息源,和国际化有关

initMessageSource();

// 初始化 context 的專件传播器

ini tApplicationEventMulticaster();

//初始化其他子类特殊的 bean

onRefresh();

//检查并炷册事件监昕器

registerListeners();

//实例化所有非巅加裁单例

finishBeanFactoryInitialization(beanFactory);

//最后一步:发布对应事件

finishRefresh();

} catch (BeansException ex) {

// …

finally {

// …

}}}

在上面的代码中,调用 finishRefresh 方法初始化容器的生 命周期处理器并发布容器的生命周期事件之后,Spring 应用 上下文正式开启,Spring Boot 核心特性也随之启动。完成 refreshContext 方法操作之后,调用 afterRefresh 方 法。最新版本的 Spring Boot 中refreshContext 方法的实现默认为空,可由开发人员自行扩展,相关代码如下。

但需要注意的是,该方法在以往的版本中方法定义和实现差距较大,如果对此方法进行扩展,在升级版本时需特别留意。

protected void afterRefresh(ConfigurableApplicationContext context,

Applicat ionArguments args) {

//默认实现为空

}

完成以上操作之后,调用 SpringApplicationRun isteners 的 started 方法,通知监听器容器启动完成,并调用 ApplicationRunner 和 CommandL ineRunner 的运行方法。

调用 ApplicationRunner 和 CommandLineRunner

========================================

ApplicationRunner 和 CommandL ineRunner 是通过 SpringApplication 类的 callRunners方法来完成的,具体代码如下。

SpringBoot运行源码分析:Spring应用上下文刷新

private void callRunners (ApplicationContext context, Applicat ionArguments a

rgs) {

List<0bject> runners = new ArrayList<>();

runners . addAll(context. getBeansOfType(ApplicationRunner. class). values());

runners . addAll(context . getBeansOfType(CommandL ineRunner . class).values());

AnnotationAwareOrderComparator. sort (runners);

for (Object runner : new LinkedHashSet<>(runners)) {

if (runner instanceof ApplicationRunner) {

callRunner((ApplicationRunner) runner, args);

}

if (runner instanceof Commandl ineRunner)

callRunner( (CommandL ineRunner) runner, args);

private void callRunner(ApplicationRunner runner, ApplicationArguments arg

s)i

try {

(runner). run(args);

} catch (Exception ex) {

throw new IllegalStateException(“Failed to execute ApplicationRunner”,

ex);

private void callRunner (CommandL ineRunner runner, ApplicationArguments arg

s) {

//内容与上面方法相同

}

}

以上代码,首先从 context 中获得类型为 ApplicationRunner 和 CommandLineRunner 的Bean, 将 它 们 放 入 List 列 表 中 并 进 行 排 序 。 然 后 再 遍 历 调 用 其 run 方 法 , 并 将ApplicationArguments 参数传入。

Spring Boot 提供这两个接口的目的,是为了我们在开发的过程中,通过它们来实现在容器启动时执行一-些操作,如果有多个实现类,可通过@Order 注解或实现 Ordered 接口来控制执行顺序。

这两个接口都提供了一个 run 方法,但不同之处在于: ApplicationRunner 中 run 方法的参数为 ApplicationArguments,而 CommandLineRunner 接口 中 run 方法的参数为 String 数组。

以上方法执行完成后,会通过 SpringApplicationRunListeners 的 running 方法通知监听器:

容器此刻已处于运行状态。至此,SpringApplication 的 run 方法执行完毕。

小结

==

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数同学面临毕业设计项目选题时,很多人都会感到无从下手,尤其是对于计算机专业的学生来说,选择一个合适的题目尤为重要。因为毕业设计不仅是我们在大学四年学习的一个总结,更是展示自己能力的重要机会。

因此收集整理了一份《2024年计算机毕业设计项目大全》,初衷也很简单,就是希望能够帮助提高效率,同时减轻大家的负担。
img
img
img

既有Java、Web、PHP、也有C、小程序、Python等项目供你选择,真正体系化!

由于项目比较多,这里只是将部分目录截图出来,每个节点里面都包含素材文档、项目源码、讲解视频

如果你觉得这些内容对你有帮助,可以添加VX:vip1024c (备注项目大全获取)
img

也有C、小程序、Python等项目供你选择,真正体系化!**

由于项目比较多,这里只是将部分目录截图出来,每个节点里面都包含素材文档、项目源码、讲解视频

如果你觉得这些内容对你有帮助,可以添加VX:vip1024c (备注项目大全获取)
[外链图片转存中…(img-ZTEhkLgC-1712535814917)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值