欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

工廠方法在Spring框架中的運用

 更新時間:2022年10月22日 17:06:40   作者:tianClassmate  
這篇文章介紹了工廠方法在Spring框架中的運用,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

我們都知道Spring中IOC是使用的工廠模式,但是對于實現(xiàn)細節(jié)就一知半解了,今天這篇文章就帶大家解讀Spring中是如何使用工廠模式的。

上篇文章中我們懂了什么是工廠模式,這篇文章就帶著學過的概念深入到Spring的內(nèi)部看看究竟是怎么使用該模式的。

在Spring中使用工廠方法的是BeanFactory和FactoryBean<>接口。

一、BeanFactory使用工廠方法

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

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

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

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)建,它同具體工廠之間一一對應。

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

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

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

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

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

二、FactoryBean<>使用工廠方法

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

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

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

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

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

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

三、BeanFactory和FactoryBean<>的異同

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

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

這篇文章加深工廠方法的理解的同時,又進一步的深入了BeanFactory和FactoryBean<>的實現(xiàn)細節(jié)。

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。如果你想了解更多相關內(nèi)容請查看下面相關鏈接

相關文章

  • MyBatis入門學習教程(一)-MyBatis快速入門

    MyBatis入門學習教程(一)-MyBatis快速入門

    MyBatis是一個支持普通SQL查詢,存儲過程和高級映射的優(yōu)秀持久層框架,這篇文章主要給大家分享MyBatis入門學習教程(一)-MyBatis快速入門,需要的朋友可以參考下
    2015-08-08
  • Java中的線程安全問題詳細解析

    Java中的線程安全問題詳細解析

    這篇文章主要介紹了Java中的線程安全問題詳細解析,線程安全是如果有多個線程在同時運行,而這些線程可能會同時運行這段代碼,程序每次運行結(jié)果和單線程運行的結(jié)果是一樣的,而且其他的變量的值也和預期的是一樣的,此時我們就稱之為是線程安全的,需要的朋友可以參考下
    2023-11-11
  • 實例解析Java的Jackson庫中的數(shù)據(jù)綁定

    實例解析Java的Jackson庫中的數(shù)據(jù)綁定

    這篇文章主要介紹了Java的Jackson庫中的數(shù)據(jù)綁定,這里分為通常的簡單數(shù)據(jù)綁定與全數(shù)據(jù)綁定兩種情況來講,需要的朋友可以參考下
    2016-01-01
  • Java自定義類數(shù)組報null的相關問題及解決

    Java自定義類數(shù)組報null的相關問題及解決

    這篇文章主要介紹了Java自定義類數(shù)組報null的相關問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • 一文看懂RabbitMQ消息丟失如何防止

    一文看懂RabbitMQ消息丟失如何防止

    這篇文章主要介紹了RabbitMQ消息丟失的場景,以及如何保證信息不丟失,看完這篇文章一定可以幫助你RabbitMQ有更深的理解,需要的朋友可以參考下
    2023-03-03
  • 詳解netty中常用的xml編碼解碼器

    詳解netty中常用的xml編碼解碼器

    這篇文章主要介紹了netty中常用的xml編碼解碼器,進行frame拆分可以使用XmlFrameDecoder,進行xml文件內(nèi)容的解析則可以使用XmlDecoder,接下來我們會詳細講解兩個decoder實現(xiàn)和使用,感興趣的朋友一起看看吧
    2022-05-05
  • springboot各種格式轉(zhuǎn)pdf的實例代碼

    springboot各種格式轉(zhuǎn)pdf的實例代碼

    這篇文章主要介紹了springboot各種格式轉(zhuǎn)pdf的實例代碼,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-01-01
  • Java中你絕對沒用過的一個關鍵字Record的使用

    Java中你絕對沒用過的一個關鍵字Record的使用

    這篇文章主要給大家介紹一個?Java?中的一個關鍵字?Record,那?Record?關鍵字跟不可變類有什么關系呢?看完今天的文章你就知道了,快跟隨小編一起學習一下吧
    2022-11-11
  • 詳解Spring-Cloud2.0之Feign調(diào)用遠程服務指南

    詳解Spring-Cloud2.0之Feign調(diào)用遠程服務指南

    這篇文章主要介紹了詳解Spring-Cloud2.0之Feign調(diào)用遠程服務指南,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-01-01
  • Java8?Stream?流常用方法合集

    Java8?Stream?流常用方法合集

    這篇文章主要介紹了?Java8?Stream?流常用方法合集,Stream?是?Java8?中處理集合的關鍵抽象概念,它可以指定你希望對集合進行的操作,可以執(zhí)行非常復雜的查找、過濾和映射數(shù)據(jù)等操作,下文相關資料,需要的朋友可以參考一下
    2022-04-04

最新評論