記一次在spring環境中 使用模板模式

場景:java

保存數據多種表單時,數據庫抽取了共性爲表  base_biz差別分別保存本身表中以下圖:算法

A_self_biz、B_self_biz、C_self_biz 自身業務表。spring

java程序使用模板模式開發,定義公共算法,和差別算法。數據庫

可是此時在模板中的公共算法即保存數據到 base_biz 時須要spring注入 baseDao。習慣了註解懶得一逼,就是不想用xml。可是抽象父類沒有注入spring天然引用不了baseDao。傻人想傻辦法。在子類中注入baseDao讓抽象父類使用。框架

模板方法:具體細節不在此展現ide

public abstract class AbstractServiceTemplate {
 

   
    BaseBizService baseBizService;
    
    BaseConfigService baseConfigService;
    
    OperationLogService operationLogService;

    /**
     * <p>
     * 方法說明 : 子類經過重寫本方法爲抽象類注入
     * </p>
     */
    protected abstract void setTemplateRef(  BaseBizService baseBizService,
           BaseConfigService baseConfigService,  OperationLogService operationLogService);

    /**
     * 方法說明 : 保存表所共同遵循的算法框架
     */

    public final void save(BizTable bt, Object selfBt) {
        // 業務邏輯驗證工單數據
        verifyBase(bt, selfBt);
        // 保存公共業務並獲取公共保存的id
        Integer code = saveBaseBiz(bt);
        // 保存自身
        if (isNeedSaveSelf()) {
            saveSelf(code, selfBt);
        }
        // 保存操做日誌
        operationLogService(wo);
    }
}

子類繼承父類並注入值: (特別注意:這裏破壞了:Dependence Inversion Principle:依賴倒置原則this

依賴倒置原則在java語言中的體現:spa

①模塊間的依賴經過抽象發生,實現類之間不發生直接的依賴關係,其依賴關係是經過接口或抽象類產生的;日誌

接口或抽象類不依賴於實現類;code

③實現類依賴接口或抽象類。

使用原則:

依賴倒置原則的本質就是經過抽象(接口或抽象類)使各個類或模塊的實現彼此獨立,不互相影響,實現模塊間的鬆耦合,咱們怎麼在項目中使用這個規則呢?只要遵循如下的幾個規則就能夠:

①每一個類儘可能都有接口或抽象類,或者抽象類和接口二者都具有

②變量的表面類型儘可能是接口或者是抽象類

③任何類都不該該從具體類派生(只要不超過兩層的繼承是能夠忍受的)

④儘可能不要複寫基類的方法

⑤結合里氏替換原則使用

/**
 * <p>
 * ItemsRecoveredSaveService描述 :  ASelfService
 * </p>
 * 
 * @author lienbo
 * @since 0.0.1
 */
@Service("aSelfService")
public class  ASelfService extends AbstractServiceTemplate {
 
 
    
    @Autowired
    BaseBizService baseBizService;
    @Autowired
    BaseConfigService baseConfigService;
    @Autowired
    OperationLogService operationLogService;

    /**
     * 方法說明 : 子類經過重寫本方法爲抽象類注入 
     */
    @Autowired
    @Override
    protected void setTemplateRef( BaseBizService baseBizService,
            BaseConfigService baseConfigService,   OperationLogService operationLogService) {
        super.baseBizService = baseBizService;
        super.baseConfigService = baseConfigService;
        super.operationLogService = operationLogService;
    }
}

因此我改了這部分代碼。在抽象父類注入。

另外:這種依賴關係,對多個表進行操做事務必定記得事務控制。

在分層數量上我遵循了 controller 對錶單進行驗證,處理數據格式。

在service層使用模板控制各個業務的邏輯。不少的是用了拋出自定義異常處理業務邏輯。

改進後:

public abstract class AbstractWorkOrderServiceTemplate {
    
    BaseBizService baseBizService;
     
    BaseConfigService baseConfigService;
  
    OperationLogService operationLogService;

    /**
     * 方法說明 : 父類注入
     */
    @Autowired
    public void setTemplateRef(BaseBizService baseBizService,BaseConfigService 
                     baseConfigService,OperationLogService operationLogService) {
        this.baseBizService= baseBizService;
        this.baseConfigService= baseConfigService;
        this.operationLogService= operationLogService; 
    }
}
相關文章
相關標籤/搜索