【Spring源碼】15.IOC之AnnotationConfigApplicationContext基于注解的上下文

image

1.前言

前面幾章 講過 ClassPathXmlApplicationContext 是基于xml配置文件 來加載 spring 容器的:包括注冊什么bean,掃描哪些包蹬竖,事務(wù)拾并,等等都是配置xml文件里课兄,維護這個配置文件非常的困難钦幔。

所以就有了 基于注解的配置形式,由AnnotationConfigApplicationContext 上下文支持。需要以注解的配置形式來支持 xml配置文件所支持 的所有功能。

接下來我們通過源碼來一一分析下殉簸。

2.AnnotationConfigApplicationContext 構(gòu)造方法

public AnnotationConfigApplicationContext(String... basePackages) {
   this();
   scan(basePackages);
   refresh();
}

接收的參數(shù) 為要 掃描的包 路徑。

2.1 this()方法

第一行就是 this();

image

會初始化AnnotatedBeanDefinitionReader和ClassPathBeanDefinitionScanner屬性沽讹。

2.1.1. 初始化AnnotatedBeanDefinitionReader

AnnotatedBeanDefinitionReader的構(gòu)造方法中,會注冊很多有用的BeanDefinitionRegistryPostProcessor類型的類般卑,用來支持注解配置。

這個工作在基于xml配置解析中是用 在解析自定義標簽 <conext:conpment-scan>的時候完成的爽雄,這里基于注解的 由構(gòu)造方法里來注冊蝠检。

image
image
image

這個方法會注冊很多的BeanDefinitionRegistryPostProcessor類型的類,比較重要的是這幾個

1. 注冊 ConfigurationClassPostProcessor

這個類用來支持 @ComponentScan,@Bean,@Import等注解盲链,非常重要

image

2.注冊 AutowiredAnnotationBeanPostProcessor

這個類之前依賴注入的時候講過了蝇率,用來支持@Autowired和@Value注解的

image

3.注冊CommonAnnotationBeanPostProcessor

這個類之前依賴注入的時候講過,用來支持@Resource依賴注入刽沾,以及方法上的@PostConstruct 和 @PreDestroy

image

2.1.2. 初始化ClassPathBeanDefinitionScanner

ClassPathBeanDefinitionScanner類 這個就是掃描器本慕,基于包路徑掃描,@ComponentScan 就是用的這個掃描器去掃描特定包下 的 含有@Component注解的類侧漓,并注冊beanDefinition锅尘。

image

構(gòu)造方法里的scan就要用他。

2.2. scan(basePackages);

AnnotationConfigApplicationContext的構(gòu)造方法里要傳入一個包路徑布蔗,基于這個包路徑 去掃描 需要注冊的bean

image

這里就會用到 上一個方法 實例化的 ClassPathBeanDefinitionScanner 掃描器進行掃描藤违。

image

掃出來需要注冊的類,創(chuàng)建BeanDefinition對象纵揍,注冊進去顿乒,后續(xù)實例化
image

2.2.1. 掃包

這個掃包的邏輯就是 遞歸的去掃,遍歷每一個類文件泽谨,判斷類上是否有 @Component注解璧榄,有的話返回

image

2.2.2. 判斷是否需要注冊

一個排除的過濾器集合特漩,命中就 不需要注冊,空的

一個 包含的過濾器集合骨杂,命中就可能需要注冊涂身,如果有@@Conditional,還需要判斷@Conditional注解,邏輯在isConditionMatch方法中搓蚪。

image

命中的過濾器蛤售,就是判斷有沒有 @Component注解,

image

2.3 refresh();

這個方法和ClassPathXmlApplicationContext 調(diào)的一樣妒潭,都是父類的AbstractApplicationContext方法悴能,是spring啟動的核心方法。

3.總結(jié)

其實這個上下文 和 基于xml配置文件的上下文 殊途同歸杜耙。差別最大的 是 ConfigurationClassPostProcessor斩芭,AutowiredAnnotationBeanPostProcessor 凌外,CommonAnnotationBeanPostProcessor 這幾個類的注冊條件不一樣,在基于注解的上下文里阻肿,這幾個類 是默認需要注冊的谈竿,它們所做的工作也沒有差別团驱。
由于xml配置的方式 在spring工程中已幾近淘汰,后續(xù)其他功能的源碼分析空凸,我們就從AnnotationConfigApplicationContext的配置方式出發(fā)嚎花。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市呀洲,隨后出現(xiàn)的幾起案子紊选,更是在濱河造成了極大的恐慌,老刑警劉巖道逗,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件兵罢,死亡現(xiàn)場離奇詭異,居然都是意外死亡滓窍,警方通過查閱死者的電腦和手機卖词,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來吏夯,“玉大人此蜈,你說我怎么就攤上這事≡肷” “怎么了裆赵?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長跺嗽。 經(jīng)常有香客問我战授,道長页藻,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任陈醒,我火速辦了婚禮惕橙,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘钉跷。我一直安慰自己弥鹦,他們只是感情好,可當我...
    茶點故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布爷辙。 她就那樣靜靜地躺著彬坏,像睡著了一般。 火紅的嫁衣襯著肌膚如雪膝晾。 梳的紋絲不亂的頭發(fā)上栓始,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天,我揣著相機與錄音血当,去河邊找鬼幻赚。 笑死,一個胖子當著我的面吹牛臊旭,可吹牛的內(nèi)容都是我干的落恼。 我是一名探鬼主播,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼离熏,長吁一口氣:“原來是場噩夢啊……” “哼佳谦!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起滋戳,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤钻蔑,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后奸鸯,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體咪笑,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年府喳,在試婚紗的時候發(fā)現(xiàn)自己被綠了蒲肋。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡钝满,死狀恐怖兜粘,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情弯蚜,我是刑警寧澤孔轴,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站碎捺,受9級特大地震影響路鹰,放射性物質(zhì)發(fā)生泄漏贷洲。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一晋柱、第九天 我趴在偏房一處隱蔽的房頂上張望优构。 院中可真熱鬧,春花似錦雁竞、人聲如沸钦椭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽彪腔。三九已至,卻和暖如春进栽,著一層夾襖步出監(jiān)牢的瞬間德挣,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工快毛, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留格嗅,地道東北人。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓唠帝,卻偏偏與公主長得像吗浩,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子没隘,可洞房花燭夜當晚...
    茶點故事閱讀 44,933評論 2 355

推薦閱讀更多精彩內(nèi)容