您好,登錄后才能下訂單哦!
本篇文章為大家展示了如何使用Spring手寫一個IOC,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。
項目中有兩種方式實現(xiàn)IOC:
第一種是基于dom4j實現(xiàn)的解析XML配置文件版
第二種是基于自定義注解實現(xiàn)全配置版
全注解版
模仿Spring原生的IOC機(jī)制如下:
Interface類型的beanDefinition不會被實例化**
String類型的beanDefinition不會被實例化
維護(hù)三個核心的map容器
使用底層存放實例化對象的容器是一個叫singletonObjects的CurrentHashMap
第二個用來輔助解決循環(huán)依賴的容器叫singletonFactories類型:CurrentHashMap
第三個用來存放bean定義信息的map容器叫beanDefinitionMap類型:CurrentHashMap
Spring底層的自己還封裝了BeanDefinition, 當(dāng)然我沒干這件事,直接用的類的描述對象 Class
自定義了四種注解如下:
CDao 用于標(biāo)識持久層的對象
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) public @interface CDao { String value()default ""; }
CService 用來標(biāo)識服務(wù)層的對象
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) public @interface CService { String value()default ""; }
CComponentScan 用來標(biāo)識主配置類,提供包掃描需要的base-packet
@Retention(RetentionPolicy.RUNTIME) @Target({ElementType.TYPE}) public @interface CComponentScan { String value()default ""; }
CAutowired 用來標(biāo)識需要自動裝配的對象
@Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interface CAutowired { String value()default ""; }
當(dāng)然他跟Spring原生的@Autowired是沒法比的,Spring自動裝配類型默認(rèn)是Autowired_no, 但是被Spring原生標(biāo)記上的對象會先按照默認(rèn)的裝配類型進(jìn)行裝配,如果沒有默認(rèn)的裝配類型,再按照byType,如果容器中存在多個相同類型的對象,就按照byName, 名字再一樣就直接報錯了
另外我說一下,說了這么多byName和byType, 那么byName,是通過哪個name呢? 如果是基于setter方法的話就是setter去掉set后,后面的名字, 如果是通過@Autowired的byName,這個name其實就是屬性名
Spring是允許程序員去改這個默認(rèn)的裝配類型的
然后在我的IOC中就比較遜色了,直接默認(rèn)按照byType,沒有合適的類型再按照byName進(jìn)行自動裝配
解決了循環(huán)依賴的問題
在我手動寫如何解決循環(huán)依賴的時候,那時候我還沒有去看源碼, 當(dāng)時我畫了幾個流程圖,但是還是卡殼了, 于是我去調(diào)試Spring的實現(xiàn), 簡直了!Spring的作者們簡直是真神!
其實說Spring如何解決循環(huán)依賴的,我前面有幾個源碼閱讀的博客,感興趣可以去看看
這里我就簡單的說下, 這件事是一個叫AutowiredAnnotationBeanDefinitonPostprocessor的后置處理器完成的, Spring在做這件事是時候,前前后后是一個偌大的繼承體系在支持,但是歸根結(jié)底是Spring玩了個漂亮的遞歸,方法名是getBean(),當(dāng)然這個遞歸還有幾個輔助容器,這幾個容器就是我上面說的幾個map ,我的IOC能寫成,就得益于這一點
XML版
注解版的IOC我是用DOM4j解析XML配置文件實現(xiàn)的, 做了下面的功能
支持setter方法依賴注入
標(biāo)識性的信息是 property
<bean id="dao1" class="com.changwu.dao.DaoImpl1"></bean> <bean id="service" class="com.changwu.service.UserServiceImpl4"> <property ref="dao1" name="daoImpl"></property> </bean>
支持構(gòu)造方法的依賴注入
標(biāo)識性的信息是 constructor-arg
<bean id="DaoImpl" class="com.changwu.dao.DaoImpl1"></bean> <bean id="service" class="com.changwu.service.UserServiceImpl3"> <constructor-arg ref ="DaoImpl" name="DaoImpl1"></constructor-arg> </bean> </bean>
支持byType的自動裝配
標(biāo)識性的信息是 byType
<beans default-autowire="byType">
主持byName的自動裝配
<beans default-autowire="byName">
上述內(nèi)容就是如何使用Spring手寫一個IOC,你們學(xué)到知識或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識儲備,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。