首先解釋面上意思,service是業(yè)務層,dao是數(shù)據(jù)訪問層。

景洪網(wǎng)站建設公司創(chuàng)新互聯(lián)公司,景洪網(wǎng)站設計制作,有大型網(wǎng)站制作公司豐富經(jīng)驗。已為景洪成百上千家提供企業(yè)網(wǎng)站建設服務。企業(yè)網(wǎng)站搭建\外貿(mào)網(wǎng)站制作要多少錢,請找那個售后服務好的景洪做網(wǎng)站的公司定做!
呵呵,這個問題我曾經(jīng)也有過,記得以前剛學編程的時候,都是在service里直接調用dao,service里面就new一個dao類對象,調用,其他有意義的事沒做,也不明白有這個有什么用,參加工作久了以后就會知道,業(yè)務才是工作中的重中之重。
我們都知道,標準主流現(xiàn)在的編程方式都是采用MVC綜合設計模式,MVC本身不屬于設計模式的一種,它描述的是一種結構,最終目的達到解耦,解耦說的意思是你更改某一層代碼,不會影響我其他層代碼,如果你會像spring這樣的框架,你會了解面向接口編程,表示層調用控制層,控制層調用業(yè)務層,業(yè)務層調用數(shù)據(jù)訪問層。初期也許都是new對象去調用下一層,比如你在業(yè)務層new一個DAO類的對象,調用DAO類方法訪問數(shù)據(jù)庫,這樣寫是不對的,因為在業(yè)務層中是不應該含有具體對象,最多只能有引用,如果有具體對象存在,就耦合了。當那個對象不存在,我還要修改業(yè)務的代碼,這不符合邏輯。好比主板上內(nèi)存壞了,我換內(nèi)存,沒必要連主板一起換。我不用知道內(nèi)存是哪家生產(chǎn),不用知道多大容量,只要是內(nèi)存都可以插上這個接口使用。這就是MVC的意義。
接下來說你感覺service的意義,其實因為你現(xiàn)在做東西分層次不是那么嚴格,在一個你們做東西業(yè)務本身也少,舉個最簡單的例子,你做一個分頁的功能,數(shù)據(jù)1000條,你20條在一個頁,你可以把這個功能寫成工具類封裝起來,然后在業(yè)務層里調用這個封裝的方法,這才是業(yè)務里真正干得事,只要沒訪問數(shù)據(jù)庫的,都要在業(yè)務里寫。
再有不明白的追問,這是經(jīng)驗問題,呵呵,其實以后你就會懂。只是剛開始寫的代碼都是有個請求,我就去數(shù)據(jù)庫取,業(yè)務幾乎沒有。
煙囪式開發(fā)模式:
上述開發(fā)模式有幾個弊端:
這樣開發(fā)模式的優(yōu)勢:
業(yè)務代碼集中在業(yè)務層 service,專注于業(yè)務對象 bo 的封裝以及業(yè)務對象給展示層 vo的轉換,封裝復用邏輯,可以減少大量重復的代碼,后期維護便捷的多。
數(shù)據(jù)庫改動只設計dao層,快速響應各個業(yè)務。
業(yè)務代碼如何拒絕 all in one
以上的controller代碼最突出的缺點就是代碼完全無法復用,完全沒有使用到面向對象封裝,集成,多態(tài)的特性。業(yè)務開發(fā)中,一般都是權限校驗,參數(shù)校驗,業(yè)務判斷,業(yè)務對象轉換數(shù)據(jù)庫操作。
我的做法是業(yè)務抽象,把公共代碼進行抽取,通過配置的形式的方式調用,使業(yè)務代碼可以以可插拔的方式選擇指定的權限校驗,參數(shù)校驗。簡單來說,就是善用AOP面向切面編程的思想,示例如下:
使用aop對權限校驗邏輯進行抽取,能夠通過注解的方式指定哪些controller需要進行權限校驗。對用戶進行數(shù)據(jù)過濾時,使用controller的攔截器獲取該用戶擁有的各類權限,并把用戶數(shù)據(jù)保存在上下文threadloal中,并且通過配置對指定url進行攔截。在業(yè)務層,從上下文拿到用戶權限數(shù)據(jù)做各類數(shù)據(jù)業(yè)務過濾,通過aop實現(xiàn)各類攔截業(yè)務的指定調用。
使用java validtion對通用的字段,例如電話號碼,身份證,進行擴展,詳細可以參考,如何使用validation校驗參數(shù)?,在項目中其他類似校驗進行復用。
業(yè)務判斷:使用設計模式對不同類型的業(yè)務開發(fā)進行封裝,集成,多態(tài)擴展;這樣在后期的擴展中可以基于開發(fā)封閉原則,針對新的業(yè)務擴展子類即可。
業(yè)務開發(fā)過程中,依照阿里巴巴研發(fā)規(guī)范的要求,存在DO(數(shù)據(jù)庫表結構一致的對象),BO(業(yè)務對象),DTO(數(shù)據(jù)傳輸對象),VO(顯示層對象),Query(查詢對象)。
使用MapStruct,可以靈活的控制的不同屬性值之間的轉換規(guī)格,比org.springframework.beans.BeanUtils.copyProperties()方法更加靈活。
例如,公共字段,生成日期,創(chuàng)建人,修改時間,修改人使用插件的形式進行封裝,在mybatis-plus中使用MetaObjectHandler,在執(zhí)行sql之前完成統(tǒng)一字段值的填充。
項目如何做好代碼注釋?
在業(yè)務中特別是狀態(tài)的值,在對外發(fā)布api的vo對象中,加上狀態(tài)枚舉值的注釋,并且使用@link 注解,可以直接連接到枚舉類,讓開發(fā)者一目了然。
Dao是封裝數(shù)據(jù)庫層操作的,寫好了就基本不修改了,所以在封裝的過程中注意必須提供最起碼的增刪查改方式,而且查比較重要,一般會提供分頁查詢
Service層是最繁瑣的一層,也是最重要的一層,一切業(yè)務的復雜處理都在這層完成,你的web層只是負責傳遞一些數(shù)據(jù)進去接受返回的結果和選擇跳轉頁面而已
分享文章:java業(yè)務層代碼 java業(yè)務層和控制層
文章URL:http://chinadenli.net/article16/doeogdg.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供靜態(tài)網(wǎng)站、用戶體驗、營銷型網(wǎng)站建設、軟件開發(fā)、品牌網(wǎng)站建設、移動網(wǎng)站建設
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)