您好,登錄后才能下訂單哦!
這篇文章主要講解了“Spring中 BeanFactory 與 FactoryBean 的區別是什么”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Spring中 BeanFactory 與 FactoryBean 的區別是什么”吧!
常說spring的核心是ioc,ioc的核心是BeanFactory。然而在spring中還有一個很容易讓人混淆的詞FactoryBean。本文通過一些mybatis源碼來講述其區別,請大家參考。
BeanFactory是在學習IOC第一課的時候就遇到的。它是生產bean的工廠。在此工廠中,我們可以生產出我們想要的bean,并且通過getBean接口進行獲取。
但是在通過getBean獲取bean之前,我們需要事先定義這個bean漲什么樣子,或者說它由哪些組件組成。定義的方式有很多,可以通過xml進行定義,或者在代碼中通過注解(@Bean、@Service)進行定義。
就好比一個Controller,在最原始的xml配置bean的時候,我們需要定義它是由哪些service組成,然后一點點的配置好。xml要與Controller的service一一對應起來。
這種方式的弊端是所有的bean都需要事先定義好,但是有時候,有的一些bean,我們只知道它大概的樣子,但是無法事先定義出其具體的功能。
就好比,我們知道它是一只鳥,但是不知道是什么種類的鳥,只有在代碼執行的時候,我才知道是什么種類的鳥。如此表達可能不太直觀,這里可以直接聯想出mybatis中的mapper。例如UserMapper。
在定義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。我們可以通過學習mybatis源碼,來更加深入的了解FactoryBean。
這里帶領大家了解下Mybatis的MapperFactoryBean,這個是生成Mapper的FactoryBean。
大家可以自行打開源碼查看,通過上圖的流程即可發現。每一個mapper是通過MapperFactoryBean的getObject方法進行創建,最后生成一個代理類。在代理類中對Mapper對應的注解信息進行解析。
相信跟一下mybatis的源碼之后,對FactoryBean會有更加深入的理解。雖然在開發時用FactoryBean的機會并不多,但是源碼中會經常遇到,例如spring cloud的feign組件,里面肯定也會看到FactoryBean的身影。
對于mybatis和feign,可以很輕松的發現其共同點:
還有我們常用的定時器框架quartz框架。里面也有JobDetailFactoryBean。Redis中有RedisClientFactoryBean。security框架的UserDetailsManagerResourceFactoryBean。其實他們都是有一個共同的特點,就是生產的bean是一種類型,在創建的過程中在實現其功能。到這是不是已經理解了FactoryBean呢?
感謝各位的閱讀,以上就是“Spring中 BeanFactory 與 FactoryBean 的區別是什么”的內容了,經過本文的學習后,相信大家對Spring中 BeanFactory 與 FactoryBean 的區別是什么這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。