91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何使用Spring手寫一個IOC

發布時間:2020-11-26 15:03:33 來源:億速云 閱讀:185 作者:Leah 欄目:開發技術

本篇文章為大家展示了如何使用Spring手寫一個IOC,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

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

  • 第一種是基于dom4j實現的解析XML配置文件版

  • 第二種是基于自定義注解實現全配置版

全注解版

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

  • Interface類型的beanDefinition不會被實例化**

  • String類型的beanDefinition不會被實例化

  • 維護三個核心的map容器

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

                  第二個用來輔助解決循環依賴的容器叫singletonFactories類型:CurrentHashMap
                  第三個用來存放bean定義信息的map容器叫beanDefinitionMap類型:CurrentHashMap
Spring底層的自己還封裝了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 id="dao1" class="com.changwu.dao.DaoImpl1"></bean>
<bean id="service" class="com.changwu.service.UserServiceImpl4">
  <property ref="dao1" name="daoImpl"></property>
</bean>

支持構造方法的依賴注入

標識性的信息是 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,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

上饶市| 清镇市| 长海县| 崇明县| 新化县| 简阳市| 文安县| 青冈县| 尼木县| 抚州市| 澄城县| 宜城市| 容城县| 农安县| 安陆市| 蓝山县| 时尚| 本溪| 霞浦县| 长兴县| 额济纳旗| 沂南县| 临邑县| 眉山市| 旺苍县| 马山县| 普兰县| 烟台市| 长寿区| 东阳市| 会宁县| 西和县| 丰城市| 甘泉县| 抚松县| 岗巴县| 枣庄市| 红原县| 墨玉县| 双城市| 驻马店市|