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

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

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

最近學(xué)習(xí)Spring的源碼,發(fā)現(xiàn)一個(gè)利器BeanPostProcessor。這個(gè)后置處理器可以在bean初始化前后對(duì)bean進(jìn)行操作。我們可以在初始化的時(shí)候?qū)ψ约合胍腷ean進(jìn)行緩存,進(jìn)而實(shí)現(xiàn)自己需要處理的邏輯。

背景

當(dāng)我們需要根據(jù)類(lèi)型調(diào)用接口不同實(shí)現(xiàn)的時(shí)候,我們可以使用工廠(chǎng)模式實(shí)現(xiàn)。下面說(shuō)下博主遇到過(guò)的兩次需要使用工廠(chǎng)的場(chǎng)景。

場(chǎng)景一:
當(dāng)有一個(gè)模塊,我們需要根據(jù)數(shù)據(jù)庫(kù)的類(lèi)型實(shí)現(xiàn)不同的的sql。我們此時(shí)需要定義一個(gè)接口然后每一種數(shù)據(jù)庫(kù)實(shí)現(xiàn)不同的sql。在調(diào)用時(shí)根據(jù)當(dāng)前的數(shù)據(jù)庫(kù)類(lèi)型調(diào)用對(duì)應(yīng)的實(shí)現(xiàn)類(lèi)。

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

工廠(chǎng)模式

靜態(tài)工廠(chǎng)

/**
 * @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("類(lèi)型錯(cuò)誤");
    }
    handler.handle(dataDO);
  }
}

動(dòng)態(tài)工廠(chǎng),通過(guò)class實(shí)現(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);
  }

}

進(jìn)入主題

BeanPostProcessor實(shí)現(xiàn)相同接口的不同實(shí)現(xiàn)bean的工廠(chǎng)

首先定義一個(gè)注解,后續(xù)用來(lái)標(biāo)示bean的處理類(lèi)型

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

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

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

}

處理類(lèi)型

/**
 * @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實(shí)現(xiàn)對(duì)bean后置處理。通過(guò)注解的類(lèi)型緩存bean對(duì)象。

/**
 * @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("類(lèi)型錯(cuò)誤");
    }
    reportDataHandler.handle(dataDO);
  }
}

自定義處理器實(shí)現(xiàn),每一種實(shí)現(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) {

  }
}

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

相關(guān)文章

  • java中的抽象類(lèi)和接口定義與用法詳解

    java中的抽象類(lèi)和接口定義與用法詳解

    在面向?qū)ο蟮母拍钪?,所有的?duì)象都是通過(guò)類(lèi)來(lái)描繪的,但是反過(guò)來(lái),并不是所有的類(lèi)都是用來(lái)描繪對(duì)象的,如果一個(gè)類(lèi)中沒(méi)有包含足夠的信息來(lái)描繪一個(gè)具體的對(duì)象,這樣的類(lèi)就是抽象類(lèi)
    2021-10-10
  • java如何將控制臺(tái)輸出日志寫(xiě)入到指定文件中

    java如何將控制臺(tái)輸出日志寫(xiě)入到指定文件中

    這篇文章主要介紹了java如何將控制臺(tái)輸出日志寫(xiě)入到指定文件中問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • java thread start()和run()方法簡(jiǎn)析

    java thread start()和run()方法簡(jiǎn)析

    本文以java中thread的start()和run()的區(qū)別做詳細(xì)介紹, 需要了解跟多的朋友可以參考下
    2012-11-11
  • spring data JPA 中的多屬性排序方式

    spring data JPA 中的多屬性排序方式

    這篇文章主要介紹了spring data JPA 中的多屬性排序方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • SpringBoot項(xiàng)目中遇到的BUG問(wèn)題及解決方法

    SpringBoot項(xiàng)目中遇到的BUG問(wèn)題及解決方法

    這篇文章主要介紹了SpringBoot項(xiàng)目中遇到的BUG問(wèn)題及解決方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-11-11
  • Java 并發(fā)編程之ThreadLocal詳解及實(shí)例

    Java 并發(fā)編程之ThreadLocal詳解及實(shí)例

    這篇文章主要介紹了Java 并發(fā)編程之ThreadLocal詳解及實(shí)例的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • MyBatis使用標(biāo)簽動(dòng)態(tài)操作數(shù)據(jù)庫(kù)詳解

    MyBatis使用標(biāo)簽動(dòng)態(tài)操作數(shù)據(jù)庫(kù)詳解

    這篇文章主要介紹了MyBatis中使用標(biāo)簽動(dòng)態(tài)操作數(shù)據(jù)庫(kù)的方法,動(dòng)態(tài)SQL是指在運(yùn)行PL/SQL塊時(shí)動(dòng)態(tài)輸入SQL語(yǔ)句,是Mybatis的強(qiáng)大特性之?,能夠完成不同條件下不同的sql拼接,需要的朋友可以參考下
    2024-05-05
  • Java預(yù)覽PDF時(shí)的文件名稱(chēng)問(wèn)題及解決

    Java預(yù)覽PDF時(shí)的文件名稱(chēng)問(wèn)題及解決

    這篇文章主要介紹了Java預(yù)覽PDF時(shí)的文件名稱(chēng)問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • spring @Scheduled定時(shí)任務(wù)注解使用方法及注意事項(xiàng)小結(jié)

    spring @Scheduled定時(shí)任務(wù)注解使用方法及注意事項(xiàng)小結(jié)

    Spring的@Scheduled注解用于定時(shí)任務(wù)調(diào)度,默認(rèn)單線(xiàn)程依次執(zhí)行,可以通過(guò)配置多線(xiàn)程調(diào)度器或使用@Async注解實(shí)現(xiàn)并行執(zhí)行,常見(jiàn)參數(shù)包括cron、fixedRate、fixedDelay、initialDelay等,本文介紹spring @Scheduled定時(shí)任務(wù)注解使用方法,感興趣的朋友一起看看吧
    2025-02-02
  • Java編程之文件讀寫(xiě)實(shí)例詳解

    Java編程之文件讀寫(xiě)實(shí)例詳解

    這篇文章主要介紹了Java編程之文件讀寫(xiě)的方法,結(jié)合實(shí)例形式較為詳細(xì)的分析了Java文件讀寫(xiě)所涉及的類(lèi)及相應(yīng)的操作技巧,需要的朋友可以參考下
    2015-12-12

最新評(píng)論