中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

Spring中 BeanFactory 與 FactoryBean 的區別是什么

發布時間:2021-07-12 10:13:35 來源:億速云 閱讀:150 作者:chen 欄目:編程語言

這篇文章主要講解了“Spring中 BeanFactory 與 FactoryBean 的區別是什么”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Spring中 BeanFactory 與 FactoryBean 的區別是什么”吧!

 

文章目錄

  • 前言
  • 為什么會有FactoryBean?
  • 通過源碼深入學習FactoryBean
 

前言

常說spring的核心是ioc,ioc的核心是BeanFactory。然而在spring中還有一個很容易讓人混淆的詞FactoryBean。本文通過一些mybatis源碼來講述其區別,請大家參考。

 

一、為什么會有FactoryBean?

BeanFactory是在學習IOC第一課的時候就遇到的。它是生產bean的工廠。在此工廠中,我們可以生產出我們想要的bean,并且通過getBean接口進行獲取。

但是在通過getBean獲取bean之前,我們需要事先定義這個bean漲什么樣子,或者說它由哪些組件組成。定義的方式有很多,可以通過xml進行定義,或者在代碼中通過注解(@Bean、@Service)進行定義。

就好比一個Controller,在最原始的xml配置bean的時候,我們需要定義它是由哪些service組成,然后一點點的配置好。xml要與Controller的service一一對應起來。

Spring中 BeanFactory 與 FactoryBean 的區別是什么  

這種方式的弊端是所有的bean都需要事先定義好,但是有時候,有的一些bean,我們只知道它大概的樣子,但是無法事先定義出其具體的功能。

就好比,我們知道它是一只鳥,但是不知道是什么種類的鳥,只有在代碼執行的時候,我才知道是什么種類的鳥。如此表達可能不太直觀,這里可以直接聯想出mybatis中的mapper。例如UserMapper。

Spring中 BeanFactory 與 FactoryBean 的區別是什么  

在定義UserMapper的時候,我們知道其最后執行的xml的sql語句。而且這樣的mapper又很多,可能還會有更多的OrderMapper、GoodsMapper等等。如果每一個都一一定義的話,會非常的麻煩。但是,我們發現mapper中的功能都是與數據庫交互的代碼。

因此規范其寫法,通過定義一些標準的寫法,就可以簡化其定義過程。這樣便出現了@Select注解和@Update注解(還有xml的標簽),這樣我們只需要在注解中寫入對應的sql,在代碼執行時候,執行對應的sql。

(搜索公眾號Java知音,回復“2021”,送你一份Java面試題寶典)

這樣一想可以認為是所有的mapper就是鳥,但是不知道它是什么鳥,或者這個鳥是做什么的(不知道每個mapper的功能),在真正創建它的時候,才去關注它具體的內容。

這樣FactoryBean的就有了其意義,它可以定義出一種類型的Bean,并且在創建的時候再去實現其具體的功能。里面有三個方法。

  • getObject 獲取bean方法,在此方法中,我們可以自己定義一個對象,然后自行修改其創建過程。通過這個方法,我們可以在mapper創建的時候再實現其具體的功能。
  • getObjectType 獲取這類的類型。
  • isSingleton 是否單例。
public interface FactoryBean<T> {
    String OBJECT_TYPE_ATTRIBUTE = "factoryBeanObjectType";

    @Nullable
    T getObject() throws Exception;

    @Nullable
    Class<?> getObjectType();

    default boolean isSingleton() {
        return true;
    }
}
   

二、通過源碼深入學習FactoryBean

如果還沒有理解FactoryBean。我們可以通過學習mybatis源碼,來更加深入的了解FactoryBean。

這里帶領大家了解下Mybatis的MapperFactoryBean,這個是生成Mapper的FactoryBean。

Spring中 BeanFactory 與 FactoryBean 的區別是什么  

大家可以自行打開源碼查看,通過上圖的流程即可發現。每一個mapper是通過MapperFactoryBean的getObject方法進行創建,最后生成一個代理類。在代理類中對Mapper對應的注解信息進行解析。

相信跟一下mybatis的源碼之后,對FactoryBean會有更加深入的理解。雖然在開發時用FactoryBean的機會并不多,但是源碼中會經常遇到,例如spring cloud的feign組件,里面肯定也會看到FactoryBean的身影。

對于mybatis和feign,可以很輕松的發現其共同點:

  • 存在一種類型的bean。mybatis是Mapper,feign是FeignClient。
  • 這種bean功能單一。mapper只跟數據庫做交互。FeignClient只是接口調用。

還有我們常用的定時器框架quartz框架。里面也有JobDetailFactoryBean。Redis中有RedisClientFactoryBean。security框架的UserDetailsManagerResourceFactoryBean。其實他們都是有一個共同的特點,就是生產的bean是一種類型,在創建的過程中在實現其功能。到這是不是已經理解了FactoryBean呢?

感謝各位的閱讀,以上就是“Spring中 BeanFactory 與 FactoryBean 的區別是什么”的內容了,經過本文的學習后,相信大家對Spring中 BeanFactory 與 FactoryBean 的區別是什么這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

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

AI

仙桃市| 顺义区| 鄂尔多斯市| 鄂托克旗| 砀山县| 永定县| 启东市| 保定市| 伊金霍洛旗| 青浦区| 观塘区| 清远市| 襄垣县| 达孜县| 右玉县| 南郑县| 兴城市| 驻马店市| 徐州市| 临清市| 乐东| 金华市| 岳阳县| 日土县| 兴隆县| 三河市| 洪洞县| 临猗县| 伊通| 探索| 施甸县| 金沙县| 光山县| 淮北市| 体育| 正安县| 长岛县| 安化县| 湖州市| 青龙| 昂仁县|