<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
我們都知道Spring中IOC是使用的工廠模式,但是對於實現細節就一知半解了,今天這篇文章就帶大家解讀Spring中是如何使用工廠模式的。
在上篇文章中我們懂了什麼是工廠模式,這篇文章就帶著學過的概念深入到Spring的內部看看究竟是怎麼使用該模式的。
在Spring中使用工廠方法的是BeanFactory和FactoryBean<>介面。
使用了Spring框架,我們就很少自己進行物件的建立了,而我們使用到的物件當然就是交給Spring的工廠模式來建立的了。
其中BeanFactory是Spring容器的頂層介面,也是Bean工廠最上層的介面,其會有很多工廠實現例如ClassPathXmlApplicationContext、XmlWebApplicationContext其中最常見的就是DefaultListableBeanFactory,我們可以把BeanFactory看成是一種工廠方法模式。
在工廠方法模式中有四個角色:
1、抽象工廠(Abstract Factory):提供了建立產品的介面,呼叫者通過它存取具體工廠的工廠方法 createProduct() 來建立產品。
2、具體工廠(ConcreteFactory):主要是實現抽象工廠中的抽象方法,完成具體產品的建立。
3、抽象產品(Product):定義了產品的規範,描述了產品的主要特性和功能。
4、具體產品(ConcreteProduct):實現了抽象產品角色所定義的介面,由具體工廠來建立,它同具體工廠之間一一對應。
BeanFactory是角色中的抽象工廠,而getBean就相當於我們範例中的createProduct()方法,用於建立物件。
DefaultListableBeanFactory等實現的工廠類就是角色中的具體工廠。
產品就是在我們開發中加上註解的@Controller@Service@compent@Configuration的類,Spring會將他們當成產品使用工廠模式生成物件。
在我們createProduct方法中是直接建立的物件,Spring肯定不會這麼的笨,我們接著看getBean方法的實現方法。
getBean方法中一系列鏈路最終呼叫到doGetBean方法用於建立物件,在doGetBean中建立物件使用的是設計模式中的代理模式。
講完BeanFactory,再介紹另外一個工廠模式的應用FactoryBean<>,想必大家也經常會比較這倆。
實際上,這兩個介面都是用於建立物件,都可以看做是工廠方法模式的實現。
FactoryBean<>工廠通過getObject()方法來建立並返回物件,我們可以通過實現FactoryBean<>來客製化化自己需要的Bean物件。
既然FactoryBean<>是留個開發者實現的,我們就手動實現一個FactoryBean<>。
@Component public class MyFactoryBean<> implements FactoryBean<><Product>, BeanNameAware { private String name; @Override public Product getObject() throws Exception { return new Product(); } @Override public Class<?> getObjectType() { return Product.class; } @Override public boolean isSingleton() { return false; } @Override public void setBeanName(String s) { this.name = name; } }
接著我們分別使用兩種方式getBean。
public static void main(String[] args) { //測試FactoryBean<> ApplicationContext ac =new AnnotationConfigApplicationContext(MyFactoryBean<>.class); System.out.println(ac.getBean("myFactoryBean<>")); System.out.println(ac.getBean("&myFactoryBean<>")); }
只是在獲取Bean時加了一個&會出現兩種情況。
cn.sky1998.create.methodFactory.Product@52a86356 cn.sky1998.create.methodFactory.MyFactoryBean<>@5ce81285
doGetBean裡面進行了判斷是否是FactoryBean<>的實現類。
Spring對FactoryBean<>的實現機制是當你獲取一個Bean時,如果獲取的Bean的型別是FactoryBean<>,並且其name中並沒有&則呼叫bean的getObject方法獲取FactoryBean<>實現類中提供bean,否則就是直接返回普通的bean型別。
當我們在引入其他框架整合Spring時,便會有很多橋接整合包,例如mybatis-spring等,其中就會有FactoryBean<>的實現,例如SqlSessionFactoryBean<>、MapperFactoryBean<>等,將需要整合的客製化化Bean通過工廠方法的模式,加入進Spring容器中。
當我們整合Mybatis時無論是多麼的Bean都能很好的處理,mybatis-spring中的FactoryBean<>正是將Mybatis的核心啟動類給呼叫出來。
BeanFactory是Spring的一個大工廠,建立著Spring框架執行過程中所需要的Bean;
而FactoryBean<>是一個客製化化工廠,其會存在於BeanFactory建立物件的過程中,當有需要時,會通過FactoryBean<>去自客製化個性化的Bean,從而Spring框架提高擴充套件能力。
這篇文章加深工廠方法的理解的同時,又進一步的深入了BeanFactory和FactoryBean<>的實現細節。
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對it145.com的支援。如果你想了解更多相關內容請檢視下面相關連結
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45