亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

詳解使用Spring的BeanPostProcessor優(yōu)雅的實現(xiàn)工廠模式

 更新時間:2020年07月08日 10:27:22   作者:愛唱歌的Coder  
這篇文章主要介紹了詳解使用Spring的BeanPostProcessor優(yōu)雅的實現(xiàn)工廠模式,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

最近學習Spring的源碼,發(fā)現(xiàn)一個利器BeanPostProcessor。這個后置處理器可以在bean初始化前后對bean進行操作。我們可以在初始化的時候對自己想要的bean進行緩存,進而實現(xiàn)自己需要處理的邏輯。

背景

當我們需要根據(jù)類型調用接口不同實現(xiàn)的時候,我們可以使用工廠模式實現(xiàn)。下面說下博主遇到過的兩次需要使用工廠的場景。

場景一:
當有一個模塊,我們需要根據(jù)數(shù)據(jù)庫的類型實現(xiàn)不同的的sql。我們此時需要定義一個接口然后每一種數(shù)據(jù)庫實現(xiàn)不同的sql。在調用時根據(jù)當前的數(shù)據(jù)庫類型調用對應的實現(xiàn)類。

場景二:
我們業(yè)務需要對接不同的傳感器設備,但是總體業(yè)務邏輯就是獲取數(shù)據(jù),發(fā)送心跳。每一種設備的數(shù)據(jù)協(xié)議又不一樣。所以需要使用工廠,根據(jù)不同的設備調用對應的實現(xiàn)類。

工廠模式

靜態(tài)工廠

/**
 * @Description
 * @Author Singh
 * @Date 2020-07-06 21:54
 * @Version
 **/
@Service
public class HandlerService1 {

  public <T> void handle(Constant.HandlerType handlerType, T dataDO) {
    IHandler handler = null;
    if(handlerType.getType().intValue() == Constant.HandlerType.HANDLE_TYEP_1.getType()){
      handler = new Type1Handler();
    }else if(handlerType.getType().intValue() == Constant.HandlerType.HANDLE_TYEP_2.getType()){
      handler = new Type2Handler();
    }else if(handlerType.getType().intValue() == Constant.HandlerType.HANDLE_TYEP_3.getType()){
      handler = new Type3Handler();
    }else if(handlerType.getType().intValue() == Constant.HandlerType.HANDLE_TYEP_4.getType()){
      handler = new Type4Handler();
    }else{
      throw new RuntimeException("類型錯誤");
    }
    handler.handle(dataDO);
  }
}

動態(tài)工廠,通過class實現(xiàn)

/**
 * @Description
 * @Author Singh
 * @Date 2020-07-06 21:54
 * @Version
 **/
@Service
public class HandlerService2 {

  public <T,H extends IHandler> void handle(Class<H> clzz, T dataDO) throws IllegalAccessException, InstantiationException {
    IHandler handler = clzz.newInstance();
    handler.handle(dataDO);
  }

}

進入主題

BeanPostProcessor實現(xiàn)相同接口的不同實現(xiàn)bean的工廠

首先定義一個注解,后續(xù)用來標示bean的處理類型

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Handler {

  @AliasFor(annotation = Component.class)
  String value() default "";

  /**
   * 業(yè)務處理類型
   * @return
   */
  Constant.HandlerType handlerType();

}

處理類型

/**
 * @Description
 * @Author Singh
 * @Date 2020-07-06 21:25
 * @Version
 **/

public class Constant {

  public enum HandlerType{
    HANDLE_TYEP_1(1),
    HANDLE_TYEP_2(2),
    HANDLE_TYEP_3(3),
    HANDLE_TYEP_4(4);
    private Integer type;

    HandlerType(Integer type) {
      this.type = type;
    }

    public Integer getType() {
      return type;
    }

  }
}

定義接口處理

/**
 * @Description
 * @Author Singh
 * @Date 2020-07-06 21:29
 * @Version
 **/
public interface IHandler<T> {

  void handle(T data);

}

BeanPostProcessor實現(xiàn)對bean后置處理。通過注解的類型緩存bean對象。

/**
 * @Description
 * @Author Singh
 * @Date 2020-07-06 21:29
 * @Version
 **/
@Service
public class HandleService implements BeanPostProcessor {

  private Map<Integer,IHandler> reportDataHandlerMap = new ConcurrentHashMap<>();

  public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
    if(bean instanceof IHandler){
      Handler[] reportHandlers = bean.getClass().getAnnotationsByType(Handler.class);
      if(reportHandlers == null || reportHandlers.length == 0){
        return bean;
      }
      Handler reportHandler = reportHandlers[0];
      reportDataHandlerMap.put(reportHandler.handlerType().getType(), (IHandler) bean);
    }
    return bean;
  }


  public <T> void handle(Constant.HandlerType handlerType, T dataDO) {
    IHandler reportDataHandler = reportDataHandlerMap.get(handlerType.getType());
    if(reportDataHandler == null){
      throw new RuntimeException("類型錯誤");
    }
    reportDataHandler.handle(dataDO);
  }
}

自定義處理器實現(xiàn),每一種實現(xiàn)一次。

/**
 * @Description
 * @Author Singh
 * @Date 2020-07-06 21:32
 * @Version
 **/
@Handler(handlerType = Constant.HandlerType.HANDLE_TYEP_1 )
public class Type1Handler implements IHandler<String>{

  @Override
  public void handle(String data) {

  }
}

到此這篇關于詳解使用Spring的BeanPostProcessor優(yōu)雅的實現(xiàn)工廠模式的文章就介紹到這了,更多相關Spring BeanPostProcessor 工廠模式內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • java 中的封裝介紹及使用方法

    java 中的封裝介紹及使用方法

    這篇文章主要介紹了java 中的封裝介紹及使用方法的相關資料,封裝是指一種將抽象性函式接口的實現(xiàn)細節(jié)部份包裝、隱藏起來的方法,需要的朋友可以參考下
    2017-08-08
  • Spring中IoC優(yōu)點與缺點解析

    Spring中IoC優(yōu)點與缺點解析

    這篇文章主要為大家詳細解析了Spring中IoC優(yōu)點與缺點,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • 超全面的SpringBoot面試題含答案

    超全面的SpringBoot面試題含答案

    這篇文章主要收錄了44道面試中經(jīng)常被問的SpringBoot問題,不管你是正在求職的新手還是已經(jīng)工作很久的高手,這篇關于SpringBoot的面試題總結一定會讓你有新的理解,讓我們一起來看看吧
    2023-03-03
  • SpringBoot集成ElasticSearch(ES)實現(xiàn)全文搜索功能

    SpringBoot集成ElasticSearch(ES)實現(xiàn)全文搜索功能

    Elasticsearch是一個開源的分布式搜索和分析引擎,它被設計用于處理大規(guī)模數(shù)據(jù)集,它提供了一個分布式多用戶能力的全文搜索引擎,本文將給大家介紹SpringBoot集成ElasticSearch(ES)實現(xiàn)全文搜索功能,需要的朋友可以參考下
    2024-02-02
  • Android仿微信實現(xiàn)左滑顯示刪除按鈕功能

    Android仿微信實現(xiàn)左滑顯示刪除按鈕功能

    這篇文章主要為大家詳細介紹了java仿微信實現(xiàn)左滑顯示刪除按鈕功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-10-10
  • Java中GC與四種引用的關系詳解

    Java中GC與四種引用的關系詳解

    這篇文章主要介紹了Java中GC與四種引用的關系詳解,Java 中一共有 4 種類型的引用 : StrongReference、 SoftReference、 WeakReference 以及 PhantomReference這 4 種類型的引用與 GC 有著密切的關系, 讓我們逐一來看它們的定義和使用場景,需要的朋友可以參考下
    2023-09-09
  • mybatis中mapper-locations的作用

    mybatis中mapper-locations的作用

    這篇文章主要介紹了mybatis中mapper-locations的具體作用,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • Java redis存Map對象類型數(shù)據(jù)的實現(xiàn)

    Java redis存Map對象類型數(shù)據(jù)的實現(xiàn)

    本文主要介紹了Java redis存Map<String,RedisCustom>對象類型數(shù)據(jù),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-05-05
  • Java 8 Stream.distinct() 列表去重的操作

    Java 8 Stream.distinct() 列表去重的操作

    這篇文章主要介紹了Java 8 Stream.distinct() 列表去重的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • 基于Java實現(xiàn)考試管理系統(tǒng)

    基于Java實現(xiàn)考試管理系統(tǒng)

    這篇文章主要介紹了基于Java實現(xiàn)的考試管理系統(tǒng),項目運用到的技術有Springboot、Maven、Jpa、Vue等等,感興趣的小伙伴可以跟隨小編一起學習一下
    2021-12-12

最新評論