場景: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; } }