我們都知道Spring中IOC是使用的工廠模式,但是對于實作細節就一知半解了,今天這篇文章就帶大家解讀Spring中是如何使用工廠模式的,
在上篇文章中我們懂了什么是工廠模式,這篇文章就帶著學過的概念深入到Spring的內部看看究竟是怎么使用該模式的,
在Spring中使用工廠方法的是BeanFactory和FactoryBean<>介面,
一、BeanFactory使用工廠方法
使用了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中創建物件使用的是設計模式中的代理模式,
二、FactoryBean<>使用工廠方法
講完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和FactoryBean<>的異同
BeanFactory是Spring的一個大工廠,創建著Spring框架運行程序中所需要的Bean;
而FactoryBean<>是一個定制化工廠,其會存在于BeanFactory創建物件的程序中,當有需要時,會通過FactoryBean<>去自定制個性化的Bean,從而Spring框架提高擴展能力,
這篇文章加深工廠方法的理解的同時,又進一步的深入了BeanFactory和FactoryBean<>的實作細節,
設計模式相關博客:
概述
一、設計模式概述
創建型設計模式
二、設計模式之工廠方法和抽象工廠
三、設計模式之單例和原型
四、設計模式之建造者模式
結構型設計模式
五、設計模式之代理模式
六、設計模式之配接器模式
七、設計模式之橋接模式
八、設計模式之組合模式
九、設計模式之裝飾器模式
十、設計模式之外觀模式
十一、設計模式之享元模式
行為型設計模式
十二、設計模式之責任鏈模式
十三、設計模式之命令模式
十四、設計模式之解釋器模式
十五、設計模式之迭代器模式
十六、設計模式之中介者模式
十七、設計模式之備忘錄模式
十八、設計模式之觀察者模式
十九、設計模式之狀態模式
二十、設計模式之策略模式
二十一、設計模式之模板方法模式
二十二、設計模式之訪問者模式
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/513716.html
標籤:設計模式
上一篇:初識設計模式 - 組合模式
