国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

模仿Spring手寫一個(gè)簡(jiǎn)易的IOC

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

這個(gè)小項(xiàng)目是我讀過一點(diǎn)Spring的源碼后,模仿Spring的IOC寫的一個(gè)簡(jiǎn)易的IOC,當(dāng)然Spring的在天上,我寫的在馬里亞納海溝,哈哈

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

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

項(xiàng)目中有兩種方式實(shí)現(xiàn)IOC:

第一種是基于dom4j實(shí)現(xiàn)的解析XML配置文件版 第二種是基于自定義注解實(shí)現(xiàn)全配置版

全注解版

模仿Spring原生的IOC機(jī)制如下:

Interface類型的beanDefinition不會(huì)被實(shí)例化** String類型的beanDefinition不會(huì)被實(shí)例化 維護(hù)三個(gè)核心的map容器

使用底層存放實(shí)例化對(duì)象的容器是一個(gè)叫singletonObjects的CurrentHashMap

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

自定義了四種注解如下:

CDao 用于標(biāo)識(shí)持久層的對(duì)象

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

CService 用來(lái)標(biāo)識(shí)服務(wù)層的對(duì)象

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

CComponentScan 用來(lái)標(biāo)識(shí)主配置類,提供包掃描需要的base-packet

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

CAutowired 用來(lái)標(biāo)識(shí)需要自動(dòng)裝配的對(duì)象

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

當(dāng)然他跟Spring原生的@Autowired是沒法比的,Spring自動(dòng)裝配類型默認(rèn)是Autowired_no, 但是被Spring原生標(biāo)記上的對(duì)象會(huì)先按照默認(rèn)的裝配類型進(jìn)行裝配,如果沒有默認(rèn)的裝配類型,再按照byType,如果容器中存在多個(gè)相同類型的對(duì)象,就按照byName, 名字再一樣就直接報(bào)錯(cuò)了

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

Spring是允許程序員去改這個(gè)默認(rèn)的裝配類型的

然后在我的IOC中就比較遜色了,直接默認(rèn)按照byType,沒有合適的類型再按照byName進(jìn)行自動(dòng)裝配

解決了循環(huán)依賴的問題

在我手動(dòng)寫如何解決循環(huán)依賴的時(shí)候,那時(shí)候我還沒有去看源碼, 當(dāng)時(shí)我畫了幾個(gè)流程圖,但是還是卡殼了, 于是我去調(diào)試Spring的實(shí)現(xiàn), 簡(jiǎn)直了!Spring的作者們簡(jiǎn)直是真神!其實(shí)說Spring如何解決循環(huán)依賴的,我前面有幾個(gè)源碼閱讀的博客,感興趣可以去看看

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

XML版

注解版的IOC我是用DOM4j解析XML配置文件實(shí)現(xiàn)的, 做了下面的功能

支持setter方法依賴注入標(biāo)識(shí)性的信息是 property

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

支持構(gòu)造方法的依賴注入

標(biāo)識(shí)性的信息是 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的自動(dòng)裝配標(biāo)識(shí)性的信息是 byType

<beans default-autowire='byType'>

主持byName的自動(dòng)裝配

<beans default-autowire='byName'>

以上就是模仿Spring手寫一個(gè)簡(jiǎn)易的IOC的詳細(xì)內(nèi)容,更多關(guān)于手寫IOC的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Spring
相關(guān)文章:
主站蜘蛛池模板: 亚洲精品一区二区综合 | 全国男人的天堂天堂网 | 久久久久欧美国产精品 | 一级v片 | 国产黄色a三级三级三级 | 亚洲精品一区二区观看 | 亚洲国产成人在线视频 | 欧美老熟妇bbbb毛片 | 国产精品大全国产精品 | 亚洲最新在线视频 | 大伊香蕉精品视频在线天堂 | 性国产精品| 欧美日韩在线看 | 一级做a毛片免费视频 | 农村寡妇一级毛片免费播放 | 九九免费精品视频在这里 | 成人欧美精品久久久久影院 | 日韩欧美一区二区在线观看 | 亚洲国产天堂久久综合网站 | 日韩一级欧美一级在线观看 | 一区二区三区精品国产 | 2021国产成人精品久久 | 久久久999国产精品 久久久99精品免费观看 | 日韩欧美在线一级一中文字暮 | www.亚洲天堂.com | 免费看又黄又爽又猛的网站 | 国产第一区二区三区在线观看 | 九九精品久久久久久噜噜 | 欧美成人精品高清在线观看 | 亚洲国产专区 | 国产成人亚洲综合网站不卡 | 亚洲第一免费播放区 | 男女那个视频免费 | 欧美日韩顶级毛片www免费看 | 成人国产在线视频在线观看 | 亚洲精品第一区二区在线 | 国产三级午夜理伦三级 | 成人免费网站在线观看 | 一级a爰片久久毛片 | 普通话对白国产情侣自啪 | 日本精品网 |