最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring中FactoryBean的高級用法實戰(zhàn)教程

 更新時間:2024年09月10日 10:46:55   作者:碼到三十五  
FactoryBean是Spring框架的高級特性,允許自定義對象的創(chuàng)建過程,適用于復雜初始化邏輯,本文給大家介紹Spring中FactoryBean的高級用法實戰(zhàn),感興趣的朋友跟隨小編一起看看吧

前言

FactoryBean 是 Spring 框架中的一個高級特性,它允許開發(fā)者通過自定義的方式控制對象的創(chuàng)建過程。當需要編寫復雜的初始化邏輯,而這些邏輯不適合直接放在類的構(gòu)造函數(shù)或初始化方法中時,FactoryBean 提供了一個很好的解決方案。通過實現(xiàn) FactoryBean 接口,可以在一個單獨的方法(通常是 getObject())中封裝所有的初始化邏輯,并將這個邏輯的結(jié)果(即對象實例)返回給 Spring 容器。

FactoryBean 接口定義了三個關(guān)鍵方法:

  • T getObject(): 返回由該工廠創(chuàng)建的對象的實例。
  • boolean isSingleton(): 指定返回的實例是否為單例。
  • Class<?> getObjectType(): 返回 getObject() 方法返回的對象類型。

Spring 框架內(nèi)部廣泛使用 FactoryBean,提供了超過50個 FactoryBean 的實現(xiàn),用于創(chuàng)建和配置各種復雜的對象。

下面基于 UserService 類,通過幾個實戰(zhàn)案例來展示 FactoryBean 的不同用法

class UserService {
  public void save() {
     System.out.println("save user ...") ;
  }
}

基本用法

在這個例子中,我們創(chuàng)建了一個簡單的 UserServiceFactoryBean,用于創(chuàng)建 UserService 的實例。

@Component
public class UserServiceFactoryBean implements FactoryBean<UserService> {
    @Override
    public UserService getObject() throws Exception {
        return new UserService();
    }
    @Override
    public Class<?> getObjectType() {
        return UserService.class;
    }
    @Override
    public boolean isSingleton() {
        return true; // 默認返回單例
    }
}

使用方式:

@Resource
private UserService userService; // 直接注入
// 或者通過 ApplicationContext 獲取
ApplicationContext context = ...;
UserService us = context.getBean(UserService.class);

創(chuàng)建多例對象

isSingleton() 方法返回 false,以創(chuàng)建多例對象。

@Override
public boolean isSingleton() {
    return false; // 返回非單例
}

此時,每次通過 Spring 容器獲取的 UserService 實例都將是新的,以下兩個Controller中注入的UserService將是兩個不同的對象:

@Component
public class UserController {
  @Resource
  private UserService userService ;
}
@Component
public class CommonService {
  @Resource
  private UserService userService ;
}

創(chuàng)建代理

使用 FactoryBean 創(chuàng)建代理對象是一種常見用法,尤其是在需要為對象添加橫切關(guān)注點(如日志、事務管理等)時。

@Override
public PersonService getObject() throws Exception {
    ProxyFactory factory = new ProxyFactory(new UserService());
    factory.addAdvice(new MethodInterceptor() {
        @Override
        public Object invoke(MethodInvocation invocation) throws Throwable {
            System.out.println("Before method call");
            Object result = invocation.proceed();
            System.out.println("After method call");
            return result;
        }
    });
    return (UserService) factory.getProxy();
}

獲取原始 FactoryBean

有時候,可能需要獲取 FactoryBean 本身而不是它創(chuàng)建的對象。

// 通過類型獲取
UserServiceFactoryBean factoryBean = context.getBean(UserServiceFactoryBean.class);
// 或者通過名稱獲取,添加 '&' 前綴
UserServiceFactoryBean factoryBeanByName = context.getBean("&userServiceFactoryBean");

利用 SPI 獲取對象

Spring 提供的 ServiceFactoryBeanServiceListFactoryBean 可以方便地用于基于 SPI 機制的服務加載。

@Configuration
public class AppConfig {
    @Bean
    public ServiceFactoryBean<DAO> daoFactoryBean() {
        ServiceFactoryBean<DAO> fb = new ServiceFactoryBean<>();
        fb.setServiceType(Partition.class);
        return fb;
    }
}

META-INF/services 目錄下創(chuàng)建與 Partition 接口全限定名對應的文件,列出所有實現(xiàn)類的全限定名。Spring 將加載并實例化這些實現(xiàn)類,并通過 daoFactoryBean 提供訪問。

com.diguobobo.helper.IdPartition
com.diguobobo.helper.DatePratition

容器中注入Partition時,將得到這里的第一個IdPartition實例。

ServiceListFactoryBean獲取所有SPI對象

如果你需要獲取 SPI 接口的所有實現(xiàn),而不是單個實現(xiàn),可以使用 ServiceListFactoryBean。這個 Bean 工廠會返回一個包含所有 SPI 實現(xiàn)的列表。配置方式與 ServiceFactoryBean 類似,但返回的將是一個列表,而不是單個對象。

@Configuration  
public class AppConfig {  
    @Bean  
    public ServiceListFactoryBean<DAO> daoListFactoryBean() {  
        ServiceListFactoryBean<DAO> fb = new ServiceListFactoryBean<>();  
        fb.setServiceType(Partition.class);  
        return fb;  
    }  
}  
// 使用時注入List<Partition>  
@Autowired  
private List<Partition> daos;

FactoryBean應用場景

1. 延遲初始化

默認情況下,Spring容器中的Bean會在容器啟動時進行初始化。但是,通過FactoryBean,你可以控制對象的創(chuàng)建時機,直到真正需要該對象時才進行創(chuàng)建。這可以通過在FactoryBean中實現(xiàn)特定的邏輯來延遲調(diào)用getObject()方法實現(xiàn)。

2. 依賴注入的高級用法

FactoryBean允許開發(fā)者在依賴注入過程中進行更精細的控制。例如,你可以根據(jù)特定的條件動態(tài)地選擇不同的Bean實例進行注入,或者根據(jù)環(huán)境變量、配置屬性等動態(tài)地創(chuàng)建Bean實例。

3. 集成第三方庫

當需要將第三方庫中的對象集成到Spring容器中時,如果這些對象的創(chuàng)建過程比較復雜或者不符合Spring的默認Bean創(chuàng)建規(guī)則,你可以通過實現(xiàn)FactoryBean來封裝這些復雜的創(chuàng)建邏輯。這樣,就可以像使用其他Spring Bean一樣使用這些第三方庫中的對象了。

4. 自定義作用域

雖然FactoryBean本身并不直接提供作用域的定義(作用域通常由Spring容器管理),但你可以通過FactoryBean來控制對象的創(chuàng)建過程,從而實現(xiàn)自定義作用域的效果。例如,可以通過FactoryBean來管理具有自定義生命周期的對象,如數(shù)據(jù)庫連接、網(wǎng)絡會話等。

5. 工廠方法的封裝

有時可能需要使用某個類的靜態(tài)工廠方法來創(chuàng)建對象實例。雖然Spring支持通過@Bean注解來引用靜態(tài)工廠方法,但實現(xiàn)FactoryBean提供了一種更加封裝和靈活的方式來處理這種情況。你可以在FactoryBean中實現(xiàn)調(diào)用靜態(tài)工廠方法的邏輯,并將FactoryBean本身注冊為Spring容器中的Bean。

6. 與AOP集成

FactoryBean可以與Spring的AOP(面向切面編程)功能集成,用于在對象創(chuàng)建過程中應用橫切關(guān)注點(如事務管理、日志記錄等)。雖然通常這些橫切關(guān)注點會應用在Bean的方法調(diào)用上,但通過在FactoryBean中實現(xiàn)特定的邏輯,你也可以在對象創(chuàng)建過程中應用這些關(guān)注點。

7. 復雜依賴的解耦

復雜的應用中,Bean之間可能存在復雜的依賴關(guān)系。通過實現(xiàn)FactoryBean,你可以將這些復雜的依賴關(guān)系封裝在FactoryBean內(nèi)部,從而簡化Bean之間的依賴關(guān)系。這樣,其他Bean只需要依賴于FactoryBean創(chuàng)建的實例,而不需要關(guān)心這些實例背后的復雜創(chuàng)建邏輯和依賴關(guān)系。

到此這篇關(guān)于Spring中FactoryBean的高級用法實戰(zhàn)的文章就介紹到這了,更多相關(guān)Spring FactoryBean用法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • springmvc處理異步請求的示例

    springmvc處理異步請求的示例

    這篇文章主要介紹了springmvc處理異步請求的示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-01-01
  • 基于HTML5+js+Java實現(xiàn)單文件文件上傳到服務器功能

    基于HTML5+js+Java實現(xiàn)單文件文件上傳到服務器功能

    應公司要求,在HTML5頁面上實現(xiàn)上傳文件到服務器功能,對于我這樣的菜鳥,真是把我難住了,最后還是請教大神搞定的,下面小編把例子分享到腳本之家平臺,供大家參考
    2017-08-08
  • 詳解java基礎(chǔ)--提示對話框的使用

    詳解java基礎(chǔ)--提示對話框的使用

    這篇文章主要介紹了java基礎(chǔ)--提示對話框的使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-03-03
  • Java中@Constraint實現(xiàn)自定義校驗注解

    Java中@Constraint實現(xiàn)自定義校驗注解

    本文主要介紹了Java中@Constraint實現(xiàn)自定義校驗注解,需配合ConstraintValidator實現(xiàn)校驗邏輯,適用于HibernateValidator等框架,感興趣的可以了解一下
    2025-05-05
  • Spring學習筆記之RestTemplate使用小結(jié)

    Spring學習筆記之RestTemplate使用小結(jié)

    這篇文章主要給大家介紹了關(guān)于Spring學習筆記之RestTemplate使用的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-08-08
  • Java中json與javaBean幾種互轉(zhuǎn)的講解

    Java中json與javaBean幾種互轉(zhuǎn)的講解

    今天小編就為大家分享一篇關(guān)于Java中json與javaBean幾種互轉(zhuǎn)的講解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • FilenameUtils.getName?函數(shù)源碼分析

    FilenameUtils.getName?函數(shù)源碼分析

    這篇文章主要為大家介紹了FilenameUtils.getName?函數(shù)源碼分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-09-09
  • SpringQuartz集群支持JDBC存儲與分布式執(zhí)行的最佳實踐

    SpringQuartz集群支持JDBC存儲與分布式執(zhí)行的最佳實踐

    SpringQuartz集群通過JDBC存儲和分布式執(zhí)行機制,有效解決了單點故障和擴展性問題,本文將詳細介紹SpringQuartz集群支持的實現(xiàn)原理、配置方法和最佳實踐,助力開發(fā)者構(gòu)建穩(wěn)定可靠的分布式調(diào)度系統(tǒng),感興趣的朋友一起看看吧
    2025-04-04
  • java連接mysql數(shù)據(jù)庫實現(xiàn)單條插入和批量插入

    java連接mysql數(shù)據(jù)庫實現(xiàn)單條插入和批量插入

    這篇文章主要為大家詳細介紹了java連接mysql數(shù)據(jù)庫實現(xiàn)單條插入和批量插入,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • Java 數(shù)組高頻考點分析講解

    Java 數(shù)組高頻考點分析講解

    數(shù)組對于每一門編程語言來說都是重要的數(shù)據(jù)結(jié)構(gòu)之一,當然不同語言對數(shù)組的實現(xiàn)及處理也不盡相同。Java 語言中提供的數(shù)組是用來存儲固定大小的同類型元素
    2022-04-04

最新評論

平塘县| 张家界市| 乌兰浩特市| 类乌齐县| 甘孜县| 偏关县| 长沙市| 镇原县| 德惠市| 全椒县| 内江市| 堆龙德庆县| 铜陵市| 康定县| 仁化县| 湛江市| 新津县| 东兴市| 驻马店市| 姚安县| 丽江市| 大埔县| 阳新县| 青浦区| 鄂伦春自治旗| 全州县| 开封市| 开化县| 洪洞县| 灵台县| 贵州省| 武汉市| 木兰县| 房山区| 恭城| 西乡县| 平果县| 莒南县| 额敏县| 永州市| 海安县|