文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Spring Boot启动了几个IoC容器?如何证明?

2024-11-30 16:56

关注

📚前言

不少面试者说Spring Boot和传统Spring/Spring MVC一样,对又不对。比如IoC容器Spring Boot只用一个,而传统的Spring MVC一般都是2个;比如Spring Boot不建议你使用@EnableWebMvc注解,而这在传统Spring MVC项目里几乎是必须的。

2017年之后,Spring Boot以不可挡之势在国内逐渐成为主流,本文这个问题就基于Spring Boot环境的。

✍正文

Ioc,即“控制反转”,它不是一种技术,而是一种设计思想。Spring框架对此提供了完整实现,并早已成为事实标准。

IoC的实现框架不只有Spring,比较著名还有Google的的Guice

理解IoC容器,是进阶Spring Boot源码的基础中的基础,那就先从这个问题开始吧:Spring Boot启动了几个IoC容器?如何证明?

启动了几个IoC容器?

1个

Tips:在传统Spring MVC环境,这个答案是1或者2;在Spring Cloud环境,答案可以是1、2、3、4...都有可能

如何证明?

如何证明才是本问题的核心嘛,否则即使上面个数答对了也会被认为是蒙的。

大部分问题都可以从两个方向上来给出证明,这就像证明某个物理/化学现象时,可以通过实验结果证明,另外也可以从书本的理论(在编程领域也就是源代码)上“证明”。

从结果上证明

我准备了一个典型的 Spring Boot项目:

为了验证这些这些Bean都来自同一个IoC容器,这里用到了ApplicationContextAware接口,就像这样:

实现了接口ApplicationContextAware的Bean,IoC容器会在初始化此Bean时回调setApplicationContext方法,将自己“传进去”。换句话讲:哪个IoC容器初始化了此Bean就传入哪个IoC容器,这不正是我们想要证明的事嘛

@Service
public class DemoService implements ApplicationContextAware {

@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
System.out.println(getClass().getSimpleName() + "所属IoC容器的地址值:"
+ ("@" + Integer.toHexString(applicationContext.hashCode())));
}

}

启动Spring Boot,控制台输出:

DemoConfiguration所属IoC容器的地址值:@4b2bac3f
DemoController所属IoC容器的地址值:@4b2bac3f
DemoService所属IoC容器的地址值:@4b2bac3f

地址值一模一样。因此可得出结论:这些Bean都来自同一个IoC容器,从而“间接”证明了Spring Boot只启动一个IoC容器。

扩展:从结果上证明的其它方式

从结果上证明,笔者上面举例的方式是最推荐的方式。但毕竟表现方式可以有多种,这里再做简单例举:

★通过依赖注入方式注入ApplicationContext进行比较,就像这样:

@Service
public class DemoService implements ApplicationContextAware {

@Autowired
private ApplicationContext applicationContext;

}

理论依据:若只有一个IoC容器,任何地方注入的ApplicationContext都应该是同一个。

★★通过Bean之间互相依赖注入,看是否能正常启动,就像这样:

@RestController
public class DemoController implements ApplicationContextAware {
@Autowired
private DemoService demoService;
}

@Service
public class DemoService implements ApplicationContextAware {
@Autowired
private DemoController demoController;
}

理论依据:不同IoC容器之间的Bean是隔离,不能互相注入。

父子容器:子容器可以注入父容器的Bean,反之不行

从源码上“证明”

Spring Boot启动过程核心,源代码都在SpringApplication#run这里:

步骤的具体详情就不展开了,太枯燥了。有兴趣的可看我之前文章的源码解析,也可看别人的或者B站的。

总之,在应用中的Spring,IoC容器要想“启动”都会调用refresh()方法,而Spring Boot有且仅会调用1次这个方法,所以可证明:Spring Boot有且只启动了1个IoC容器。

🍞总结

如果Spring家族没有推出Spring Boot,Spring是有被取代风险的,因为那时的开发者对它的配置繁琐、使用曲线较高已有所反感(即使比EJB还轻太多)。

Spring Boot横空出世的宗旨就一个:让一切变得简单,一个框架、一个入口、一个IoC容器(摒弃复杂的父子容器概念),大大降低了使用复杂度。迅速普及,从而巩固了Spring的霸主地位,不可撼动。

复杂度不可能凭空消失,Spring Boot只是将它留给了自己,这不正是优秀框架该有的样子嘛

来源:YourBatman内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯