偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

Spring Boot啟動了幾個IoC容器?如何證明?

開發(fā) 前端
如果Spring家族沒有推出Spring Boot,Spring是有被取代風險的,因為那時的開發(fā)者對它的配置繁瑣、使用曲線較高已有所反感(即使比EJB還輕太多)。

你好,我是YourBatman:當我老了,也寫代碼;不為別的,只為愛好。

??前言

不少面試者說Spring Boot和傳統(tǒng)Spring/Spring MVC一樣,對又不對。比如IoC容器Spring Boot只用一個,而傳統(tǒng)的Spring MVC一般都是2個;比如Spring Boot不建議你使用@EnableWebMvc注解,而這在傳統(tǒng)Spring MVC項目里幾乎是必須的。

2017年之后,Spring Boot以不可擋之勢在國內逐漸成為主流,本文這個問題就基于Spring Boot環(huán)境的。

?正文

Ioc,即“控制反轉”,它不是一種技術,而是一種設計思想。Spring框架對此提供了完整實現,并早已成為事實標準。

IoC的實現框架不只有Spring,比較著名還有Google的的Guice

理解IoC容器,是進階Spring Boot源碼的基礎中的基礎,那就先從這個問題開始吧:Spring Boot啟動了幾個IoC容器?如何證明?

啟動了幾個IoC容器?

1個

Tips:在傳統(tǒng)Spring MVC環(huán)境,這個答案是1或者2;在Spring Cloud環(huán)境,答案可以是1、2、3、4...都有可能

如何證明?

如何證明才是本問題的核心嘛,否則即使上面?zhèn)€數答對了也會被認為是蒙的。

大部分問題都可以從兩個方向上來給出證明,這就像證明某個物理/化學現象時,可以通過實驗結果證明,另外也可以從書本的理論(在編程領域也就是源代碼)上“證明”。

從結果上證明

我準備了一個典型的 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是有被取代風險的,因為那時的開發(fā)者對它的配置繁瑣、使用曲線較高已有所反感(即使比EJB還輕太多)。

Spring Boot橫空出世的宗旨就一個:讓一切變得簡單,一個框架、一個入口、一個IoC容器(摒棄復雜的父子容器概念),大大降低了使用復雜度。迅速普及,從而鞏固了Spring的霸主地位,不可撼動。

復雜度不可能憑空消失,Spring Boot只是將它留給了自己,這不正是優(yōu)秀框架該有的樣子嘛

責任編輯:武曉燕 來源: YourBatman
相關推薦

2009-06-22 10:20:01

Spring IoC容

2023-09-27 08:14:56

2023-06-02 16:24:46

SpringBootSSM

2024-12-16 08:10:00

Spring開發(fā)

2025-06-19 09:53:30

Spring性能優(yōu)化服務器

2023-04-28 08:43:46

2025-03-14 10:37:24

SpringSpring IOC容器

2025-05-21 10:09:09

Spring 5.xIOC編程

2024-05-17 10:10:59

Web容器Undertow

2019-07-15 10:00:53

DockerJava容器

2019-07-15 16:00:24

Docker架構容器

2017-03-06 15:43:33

Springboot啟動

2023-10-25 18:08:13

應用容器化Docker

2020-08-06 00:14:16

Spring IoC依賴注入開發(fā)

2015-10-09 11:02:02

2020-07-14 11:00:12

Spring BootRedisJava

2021-08-06 08:04:14

Spring Boot自動配置

2022-12-07 08:02:43

Spring流程IOC

2025-08-12 05:00:00

2021-04-29 07:18:21

Spring IOC容器單例
點贊
收藏

51CTO技術棧公眾號