四大核心
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://www.uj5u.com/houduan/247198.html
標籤:java
下一篇:C/C++編程筆記:回文程式實體
