亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

模仿Spring手寫一個簡易的IOC

 更新時間:2020年11月25日 16:06:21   作者:賜我白日夢  
這篇文章主要介紹了模仿Spring手寫一個簡易的IOC,幫助大家更好的理解和學(xué)習(xí)spring框架,感興趣的朋友可以了解下

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

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

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

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

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

全注解版

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

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

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

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

自定義了四種注解如下:

CDao 用于標識持久層的對象

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

CService 用來標識服務(wù)層的對象

@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進行自動裝配

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

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

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

XML版

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

支持setter方法依賴注入
標識性的信息是 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)造方法的依賴注入

標識性的信息是 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的自動裝配
標識性的信息是 byType

<beans default-autowire="byType">

主持byName的自動裝配

<beans default-autowire="byName">

以上就是模仿Spring手寫一個簡易的IOC的詳細內(nèi)容,更多關(guān)于手寫IOC的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • java?SpringBoot注解@Async不生效的解決方法

    java?SpringBoot注解@Async不生效的解決方法

    大家好,本篇文章主要講的是java?SpringBoot注解@Async不生效的解決方法,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-01-01
  • java 實現(xiàn)隨機數(shù)組輸出及求和實例詳解

    java 實現(xiàn)隨機數(shù)組輸出及求和實例詳解

    這篇文章主要介紹了java 實現(xiàn)隨機數(shù)組輸出及求和實例詳解的相關(guān)資料,需要的朋友可以參考下
    2016-11-11
  • Java數(shù)據(jù)結(jié)構(gòu)之循環(huán)隊列簡單定義與用法示例

    Java數(shù)據(jù)結(jié)構(gòu)之循環(huán)隊列簡單定義與用法示例

    這篇文章主要介紹了Java數(shù)據(jù)結(jié)構(gòu)之循環(huán)隊列簡單定義與用法,簡要描述了循環(huán)隊列的概念、原理,并結(jié)合實例形式分析了java循環(huán)隊列的定義與使用方法,需要的朋友可以參考下
    2017-10-10
  • java中基本注解的知識點總結(jié)

    java中基本注解的知識點總結(jié)

    在本篇文章里小編給大家整理的是一篇關(guān)于java中基本注解的知識點總結(jié),有需要的朋友們可以跟著學(xué)習(xí)下。
    2021-06-06
  • Spring中的@Scheduled源碼解析

    Spring中的@Scheduled源碼解析

    這篇文章主要介紹了Spring中的@Scheduled源碼解析,定時任務(wù)調(diào)度的基礎(chǔ)是ScheduledAnnotationBeanPostProcessor類,這是一個實現(xiàn)了BeanPostProcessor接口的后置處理器,需要的朋友可以參考下
    2023-09-09
  • Java?源碼重讀系列之?HashMap

    Java?源碼重讀系列之?HashMap

    這篇文章主要為大家介紹了Java源碼重讀系列之HashMap示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-04-04
  • Java中ArrayList類詳細介紹

    Java中ArrayList類詳細介紹

    這篇文章主要介紹了Java中ArrayList類詳細介紹的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • 談?wù)剬ava多態(tài)性的一點理解

    談?wù)剬ava多態(tài)性的一點理解

    多態(tài)就是指程序中定義的引用變量所指向的具體類型和通過該引用變量發(fā)出的方法調(diào)用在編程時并不確定,而是在程序運行期間才確定,即一個引用變量倒底會指向哪個類的實例對象,該引用變量發(fā)出的方法調(diào)用到底是哪個類中實現(xiàn)的方法,必須在由程序運行期間才能決定
    2017-08-08
  • Java中Comparator升序降序的具體使用

    Java中Comparator升序降序的具體使用

    本文主要介紹了Java中Comparator升序降序的具體使用,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • java中ResultSet遍歷數(shù)據(jù)操作

    java中ResultSet遍歷數(shù)據(jù)操作

    這篇文章主要介紹了java中ResultSet遍歷數(shù)據(jù)操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08

最新評論