開篇先上一張,工程圖片:
這篇文章已經(jīng)拖了好久了被芳,剛好最近有點時間缰贝,終于開搞了。spring 的ioc 和aop作為spring的重要功能畔濒,相信大家都已經(jīng)很熟悉了剩晴。
下面再簡單的介紹一下:
IOC : 全稱 Inversion of control , 翻譯為控制反轉(zhuǎn),還有一個別名di (Dependency injection) 即依賴注入侵状。 由容器來負責對象的生命周期和對象之間的關(guān)系赞弥,在沒有spring之前,對象的創(chuàng)建和注入都是都開發(fā)人員保證的趣兄,有了ioc 之后绽左, 都交由容器來操作。
AOP: Aspect Oriented programming 面向切面編程艇潭,在程序開發(fā)中用來解決一些系統(tǒng)層面的問題拼窥,比如 日志 事物 權(quán)限等。 降低代碼的侵入性蹋凝,執(zhí)行一些與業(yè)務(wù)無關(guān)的邏輯鲁纠。
接下來用張圖來看下,spring ioc 的運行原理圖:
整個流程鳍寂,大致分為如下的幾部:
- 資源定位: spring會解析項目中的xml改含,注解,java,自動裝配的配置信息迄汛,使用ClassLoader 加載到內(nèi)存中候味,為解析做準備
- 配置元信息的解析:spring會解析這些配置文件,并存放到容器中隔心,使用Map進行保存,配置的元信息被解析為BeanDefinition類
- 創(chuàng)建Bean的實例 : spring根據(jù)解析到的BeanNames , 采用循環(huán)遍歷的方式尚胞,進行bean的創(chuàng)建操作疮绷,創(chuàng)建步驟分為了三部分归斤,bean的實例化(依據(jù)掃描到的Class信息進行創(chuàng)建),Bean的初始化完成屬性的注入寂拆,
- 執(zhí)行BeanPostProcessor后置處理器,執(zhí)行 postProcessBeforInstantiation()方法和PostProcessAfterInstantiation()方法诸尽,切面中方法的織入也是在該步驟中執(zhí)行的,下面會進行介紹
spring aop 實現(xiàn)
切面類的織入是在初始化完成之后,執(zhí)行BeanProcessor的時候抽减,完成的。具體的流程參考圖片橄碾,此處就不再贅述了卵沉。
下面看下spring的高級特性:
1.獲取Spring IOC 容器(Aware)
通過ApplicationContextAware實現(xiàn),在bean實例化后法牲,經(jīng)過Aware掃描時史汗,發(fā)現(xiàn)實現(xiàn)了ApplicationContextAware接口,就會調(diào)用setApplicationContext方法注入applicationcontext對象拒垃,這也是非常經(jīng)典的一種獲取上下文的方法停撞。
2.動態(tài)注冊Bean信息(BeanDefinitionRegistryPostProcessor)
通過實現(xiàn)BeanDefinitionRegistryPostProcessor接口完成bean的動態(tài)注入, 動態(tài)注入Bean非常的簡單悼瓮,獲取到當前容器后戈毒,然后調(diào)用registerBeanDefinition既可。
3.動態(tài)修改bean信息(BeanFactoryPostProcessor)
4.自定義工廠bean實例化 (AbstractFacotryBean)
5.通過Spring事件機制完成服務(wù)啟動后的信息整理(ApplicationListener)
6.服務(wù)啟動完成后初始化任務(wù)(CommandLineRuner)
最后的最后横堡,上我手寫的源碼地址:https://github.com/topyuluo/spring-project
盡量保留了spring的設(shè)計原理和思想埋市,希望對理解源碼有幫助。