成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

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

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

??前言

不少面試者說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
相關推薦

2009-06-22 10:20:01

Spring IoC容

2023-09-27 08:14:56

2025-03-14 10:37:24

SpringSpring IOC容器

2025-05-21 10:09:09

Spring 5.xIOC編程

2025-06-19 09:53:30

Spring性能優化服務器

2024-12-16 08:10:00

Spring開發

2023-06-02 16:24:46

SpringBootSSM

2023-04-28 08:43:46

2024-05-17 10:10:59

Web容器Undertow

2019-07-15 16:00:24

Docker架構容器

2019-07-15 10:00:53

DockerJava容器

2017-03-06 15:43:33

Springboot啟動

2023-10-25 18:08:13

應用容器化Docker

2020-08-06 00:14:16

Spring IoC依賴注入開發

2015-10-09 11:02:02

2020-07-14 11:00:12

Spring BootRedisJava

2021-08-06 08:04:14

Spring Boot自動配置

2012-02-02 13:04:50

JavaSpring

2023-10-15 22:40:25

插件JIB

2022-12-07 08:02:43

Spring流程IOC
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产超碰人人爽人人做人人爱 | 成人午夜视频在线观看 | 欧美日韩在线一区二区三区 | 国产精品资源在线 | 欧美日韩在线看 | 一级爱爱片 | 91se在线| 色综合久久天天综合网 | 亚洲精品久久久久久一区二区 | 国产在线中文字幕 | 91天堂 | 国产乱码精品一区二区三区忘忧草 | 91精品91久久久 | 日本中文字幕在线观看 | 国产精品国产精品国产专区不卡 | 日韩精品一区二区三区 | 成人免费观看视频 | 天天看天天干 | 国产 欧美 日韩 一区 | 日本不卡一区二区 | 日本涩涩视频 | 精品视频一区二区三区在线观看 | 成人在线视频免费播放 | 97国产精品 | 精品国产乱码久久久久久88av | 欧美日韩高清一区二区三区 | 国产精品久久久久久久久久久久冷 | 一区二区三区四区av | 亚洲精品女人久久久 | 亚洲一区精品在线 | 亚洲精选久久 | 超碰在线国产 | 欧美日韩网站 | 91精品国产高清一区二区三区 | 丝袜 亚洲 另类 欧美 综合 | 国产乱码精品一区二区三区中文 | 欧美日韩一区二区三区视频 | 欧美一级免费看 | 夜夜草| 久久中文免费视频 | 久久欧美高清二区三区 |