溫馨提示×

溫馨提示×

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

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

工廠方法在Spring框架中怎么運用

發(fā)布時間:2022-10-24 09:58:55 來源:億速云 閱讀:139 作者:iii 欄目:開發(fā)技術(shù)

今天小編給大家分享一下工廠方法在Spring框架中怎么運用的相關(guān)知識點,內(nèi)容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

一、BeanFactory使用工廠方法

使用了Spring框架,我們就很少自己進行對象的創(chuàng)建了,而我們使用到的對象當(dāng)然就是交給Spring的工廠模式來創(chuàng)建的了。

其中BeanFactory是Spring容器的頂層接口,也是Bean工廠最上層的接口,其會有很多工廠實現(xiàn)例如ClassPathXmlApplicationContext、XmlWebApplicationContext其中最常見的就是DefaultListableBeanFactory,我們可以把BeanFactory看成是一種工廠方法模式。

工廠方法在Spring框架中怎么運用

在工廠方法模式中有四個角色:

1、抽象工廠(Abstract Factory):提供了創(chuàng)建產(chǎn)品的接口,調(diào)用者通過它訪問具體工廠的工廠方法 createProduct() 來創(chuàng)建產(chǎn)品。

2、具體工廠(ConcreteFactory):主要是實現(xiàn)抽象工廠中的抽象方法,完成具體產(chǎn)品的創(chuàng)建。

3、抽象產(chǎn)品(Product):定義了產(chǎn)品的規(guī)范,描述了產(chǎn)品的主要特性和功能。

4、具體產(chǎn)品(ConcreteProduct):實現(xiàn)了抽象產(chǎn)品角色所定義的接口,由具體工廠來創(chuàng)建,它同具體工廠之間一一對應(yīng)。

BeanFactory是角色中的抽象工廠,而getBean就相當(dāng)于我們實例中的createProduct()方法,用于創(chuàng)建對象。

DefaultListableBeanFactory等實現(xiàn)的工廠類就是角色中的具體工廠。

產(chǎn)品就是在我們開發(fā)中加上注解的@Controller@Service@compent@Configuration的類,Spring會將他們當(dāng)成產(chǎn)品使用工廠模式生成對象。

在我們createProduct方法中是直接創(chuàng)建的對象,Spring肯定不會這么的笨,我們接著看getBean方法的實現(xiàn)方法。

getBean方法中一系列鏈路最終調(diào)用到doGetBean方法用于創(chuàng)建對象,在doGetBean中創(chuàng)建對象使用的是設(shè)計模式中的代理模式。

二、FactoryBean<>使用工廠方法

講完BeanFactory,再介紹另外一個工廠模式的應(yīng)用FactoryBean<>,想必大家也經(jīng)常會比較這倆。

實際上,這兩個接口都是用于創(chuàng)建對象,都可以看做是工廠方法模式的實現(xiàn)。

FactoryBean<>工廠通過getObject()方法來創(chuàng)建并返回對象,我們可以通過實現(xiàn)FactoryBean<>來定制化自己需要的Bean對象。

工廠方法在Spring框架中怎么運用

既然FactoryBean<>是留個開發(fā)者實現(xiàn)的,我們就手動實現(xiàn)一個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時加了一個&會出現(xiàn)兩種情況。

cn.sky1998.create.methodFactory.Product@52a86356
cn.sky1998.create.methodFactory.MyFactoryBean<>@5ce81285

doGetBean里面進行了判斷是否是FactoryBean<>的實現(xiàn)類。

Spring對FactoryBean<>的實現(xiàn)機制是當(dāng)你獲取一個Bean時,如果獲取的Bean的類型是FactoryBean<>,并且其name中并沒有&則調(diào)用bean的getObject方法獲取FactoryBean<>實現(xiàn)類中提供bean,否則就是直接返回普通的bean類型。

當(dāng)我們在引入其他框架整合Spring時,便會有很多橋接整合包,例如mybatis-spring等,其中就會有FactoryBean<>的實現(xiàn),例如SqlSessionFactoryBean<>、MapperFactoryBean<>等,將需要整合的定制化Bean通過工廠方法的模式,加入進Spring容器中。

當(dāng)我們整合Mybatis時無論是多么的Bean都能很好的處理,mybatis-spring中的FactoryBean<>正是將Mybatis的核心啟動類給調(diào)用出來。

三、BeanFactory和FactoryBean<>的異同

BeanFactory是Spring的一個大工廠,創(chuàng)建著Spring框架運行過程中所需要的Bean;

而FactoryBean<>是一個定制化工廠,其會存在于BeanFactory創(chuàng)建對象的過程中,當(dāng)有需要時,會通過FactoryBean<>去自定制個性化的Bean,從而Spring框架提高擴展能力。

以上就是“工廠方法在Spring框架中怎么運用”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學(xué)習(xí)更多的知識,請關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI