av一区二区在线观看_亚洲男人的天堂网站_日韩亚洲视频_在线成人免费_欧美日韩精品免费观看视频_久草视

您的位置:首頁技術文章
文章詳情頁

模仿Spring手寫一個簡易的IOC

瀏覽:65日期:2023-07-31 10:12:20

這個小項目是我讀過一點Spring的源碼后,模仿Spring的IOC寫的一個簡易的IOC,當然Spring的在天上,我寫的在馬里亞納海溝,哈哈

感興趣的小伙伴可以去我的github拉取代碼看著玩

地址: https://github.com/zhuchangwu/CIOC

項目中有兩種方式實現IOC:

第一種是基于dom4j實現的解析XML配置文件版 第二種是基于自定義注解實現全配置版

全注解版

模仿Spring原生的IOC機制如下:

Interface類型的beanDefinition不會被實例化** String類型的beanDefinition不會被實例化 維護三個核心的map容器

使用底層存放實例化對象的容器是一個叫singletonObjects的CurrentHashMap

第二個用來輔助解決循環依賴的容器叫singletonFactories類型:CurrentHashMap 第三個用來存放bean定義信息的map容器叫beanDefinitionMap類型:CurrentHashMapSpring底層的自己還封裝了BeanDefinition, 當然我沒干這件事,直接用的類的描述對象 Class

自定義了四種注解如下:

CDao 用于標識持久層的對象

@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)public @interface CDao { String value()default '';}

CService 用來標識服務層的對象

@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)public @interface CService { String value()default '';}

CComponentScan 用來標識主配置類,提供包掃描需要的base-packet

@Retention(RetentionPolicy.RUNTIME)@Target({ElementType.TYPE})public @interface CComponentScan { String value()default '';}

CAutowired 用來標識需要自動裝配的對象

@Target(ElementType.FIELD)@Retention(RetentionPolicy.RUNTIME)public @interface CAutowired { String value()default '';}

當然他跟Spring原生的@Autowired是沒法比的,Spring自動裝配類型默認是Autowired_no, 但是被Spring原生標記上的對象會先按照默認的裝配類型進行裝配,如果沒有默認的裝配類型,再按照byType,如果容器中存在多個相同類型的對象,就按照byName, 名字再一樣就直接報錯了

另外我說一下,說了這么多byName和byType, 那么byName,是通過哪個name呢? 如果是基于setter方法的話就是setter去掉set后,后面的名字, 如果是通過@Autowired的byName,這個name其實就是屬性名

Spring是允許程序員去改這個默認的裝配類型的

然后在我的IOC中就比較遜色了,直接默認按照byType,沒有合適的類型再按照byName進行自動裝配

解決了循環依賴的問題

在我手動寫如何解決循環依賴的時候,那時候我還沒有去看源碼, 當時我畫了幾個流程圖,但是還是卡殼了, 于是我去調試Spring的實現, 簡直了!Spring的作者們簡直是真神!其實說Spring如何解決循環依賴的,我前面有幾個源碼閱讀的博客,感興趣可以去看看

這里我就簡單的說下, 這件事是一個叫AutowiredAnnotationBeanDefinitonPostprocessor的后置處理器完成的, Spring在做這件事是時候,前前后后是一個偌大的繼承體系在支持,但是歸根結底是Spring玩了個漂亮的遞歸,方法名是getBean(),當然這個遞歸還有幾個輔助容器,這幾個容器就是我上面說的幾個map ,我的IOC能寫成,就得益于這一點

XML版

注解版的IOC我是用DOM4j解析XML配置文件實現的, 做了下面的功能

支持setter方法依賴注入標識性的信息是 property

<bean class='com.changwu.dao.DaoImpl1'></bean><bean class='com.changwu.service.UserServiceImpl4'> <property ref='dao1' name='daoImpl'></property></bean>

支持構造方法的依賴注入

標識性的信息是 constructor-arg

<bean class='com.changwu.dao.DaoImpl1'></bean><bean class='com.changwu.service.UserServiceImpl3'> <constructor-arg ref ='DaoImpl' name='DaoImpl1'></constructor-arg></bean></bean>

支持byType的自動裝配標識性的信息是 byType

<beans default-autowire='byType'>

主持byName的自動裝配

<beans default-autowire='byName'>

以上就是模仿Spring手寫一個簡易的IOC的詳細內容,更多關于手寫IOC的資料請關注好吧啦網其它相關文章!

標簽: Spring
相關文章:
主站蜘蛛池模板: 精品日韩 | 国产极品粉嫩美女呻吟在线看人 | 色吧色综合 | 99精品免费久久久久久日本 | 国产福利91精品一区二区三区 | 亚洲天堂免费在线 | 欧美久久久 | 一区二区三区观看视频 | 欧美日韩在线观看一区二区三区 | 亚洲免费影院 | 亚洲国产成人精品久久久国产成人一区 | 五月天国产视频 | 自拍偷拍第一页 | 国产日产欧产精品精品推荐蛮挑 | 亚洲一区二区三区在线免费观看 | 一区二区精品 | 亚洲欧洲小视频 | 亚洲免费一区二区 | 国产草草视频 | 中文字幕国产视频 | 久久国产欧美日韩精品 | 欧美αv| 国产免费观看一级国产 | 久久成人精品 | 一区二区三区高清 | 精品国产一区二区国模嫣然 | 99热热热热 | 欧美一区二区大片 | 日日夜夜精品视频 | 精品欧美一区二区三区精品久久 | 午夜成人免费视频 | 亚洲激情视频在线 | 久久久久久久久一区 | 国产二区三区 | 手机看片169 | www.日本精品 | 激情五月综合网 | 羞羞视频网站在线观看 | 精品国产乱码久久久久久a丨 | 亚洲啪啪 | 一级毛片色一级 |