SpringBoot四大核心之自動裝配——源碼解析 四大核心 初學體驗 言歸正傳 演示收尾

四大核心

1、自動裝配:簡單配置甚至零配置即可運行項目
2、Actuator:springboot程序監控器
3、starter:jar包的引入,解決jar版本衝突問題
4、CLI:命令行

初學體驗

記得剛開始學自動裝配的時候,有兩個註解用的很爽,分別是@Autowired和@Resource。當時還記得@Autowired默認裝配是byType,可以通過@Qualifile爲byName,@Resource默認裝配是byName,找不到自動byType。然後還記得,加了@Component註解或其衍生註解之後就能裝配了。今天的話,我們主要聊聊,我們的Bean是如何被加載到容器中的。

言歸正傳

研究自動裝配的源碼,那就從@SpringBootApplication註解開始吧!

我們點進去源碼可以發現,@SpringBootApplication是一個組合註解,其中上面那三個是屬於Java提供的元註解,@Inherited是指可繼承的(如果@SpringBootApplication註解作用於類A上,然後B繼承了A,那麼B也具有該註解的功能)。重要的註解是下面這三個@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan。 @SpringBootConfiguration

看似很高大上的@SpringBootConfiguration註解,點進去一看,其實他就是繼承了@Configuration,說白了,他就是一個配置註解,作用的話,就是表明某個類是一個配置類。 @ComponentScan 這個註解默認會掃描該類所在的包下所有被@Component註解或其衍生註解所標註的類。 @EnableAutoConfiguration 這個註解就比較牛逼了,他是自動裝配的總開關,意思是開啓自動裝配。

點進去可以看到有一個沒見過的註解@AutoConfigurationPackage,這是什麼作用呢?從名字中大致能看出,自動配置包,差不多吧,他的意思就是添加該註解的類所在的包作爲 自動配置包進行管理,不太明白?點進去!

點進去,我們發現,裏面有一個@Import({Registrar.class})

繼續點進去,終於看到代碼了,大致可以看出來,這是用來註冊bean的,這裏我們着重看一下registerBeanDefinitions方法,方法裏有一個參數是BeanDefinitionRegistry registry,聽名字就有那味了,重點來了,這裏通過一個構造方法進行設置了packageNamenew PackageImports(metadata).getPackageNames(),接下來我要做什麼,想必大家都知道了,點進去這個構造方法。

到這裏終於把包名給set上了,接下來我們可以看看register方法了,溫馨提示:剛剛是從register(registry, new PackageImports(metadata).getPackageNames().toArray(new String[0]));的構造方法點進來的(貴人多忘事嘛)。

這裏會走else,這個方法呢,就完成了該包下的bean注入到容器中。

講解完了@AutoConfigurationPackage註解,接下來看看這個@Import(AutoConfigurationImportSelector.class),這個是導入自動裝配的ImportSelector類。 AutoConfigurationImportSelector

可以看到他實現了DeferredImportSelector接口

繼續點,可以看到,他繼承了ImportSelector接口。

在ImportSelector中有一個方法,是selectImports方法

可以清楚的看到,AutoConfigurationImportSelector實現了該方法

在這裏首先是判斷了自動裝配的開關

然後獲取需要裝配的bean

其中這裏的getCandidateConfigurations方法是讀取META-INF/spring.factories

在AutoConfigurationImportSelector下,還有一個重要的靜態內部類,該靜態內部類的構造器中初始化讀取META-INF/spring-autoconfigure-metadata.properties。

演示收尾

上面所講的讀取的文件也就是這兩個

點進去spring-autoconfigure-metadata.properties,裏面是自動裝配的一些元數據。

點進去spring.factories

點進去一個可以發現,裏面都是寫好的bean,就等被加載呢!

到這裏我們大致就明白了,只要我們按照約定來寫spring.factories,那麼我們也可以自己定義starter,把我們的bean封裝到一個配置類中!今天的分享就到這裏了,有什麼寫的不好的地方歡迎私信留言,讓我們一起探討,一起學習!

來源:https://blog.csdn.net/HeZhiYing_/article/details/112426839?utm_medium=distribute.pc_category.none-task-blog-hot-2.nonecase&depth_1-utm_source=distribute.pc_category.none-task-blog-hot-2.nonecase&request_id=

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章