javascript
spring体系结构_了解Spring Web应用程序体系结构:经典方法
spring體系結(jié)構(gòu)
每個(gè)開發(fā)人員必須了解兩件事:
真正的體系結(jié)構(gòu)是從開發(fā)人員編寫的代碼中找到的,如果不設(shè)計(jì)應(yīng)用程序的體系結(jié)構(gòu),最終將得到一個(gè)具有多個(gè)體系結(jié)構(gòu)的應(yīng)用程序。
這是否意味著開發(fā)人員應(yīng)由建筑師統(tǒng)治?
不行 架構(gòu)設(shè)計(jì)非常重要,不能只留給建筑師 ,這就是為什么每個(gè)想要不僅僅是一個(gè)類型編寫者的開發(fā)人員都必須擅長(zhǎng) 于此 。
讓我們從兩個(gè)原則入手,這兩個(gè)原則將幫助我們?yōu)榛赟pring的Web應(yīng)用程序設(shè)計(jì)更好,更簡(jiǎn)單的體系結(jié)構(gòu)。
優(yōu)秀建筑的兩大Struts
建筑設(shè)計(jì)可能感覺像是一項(xiàng)艱巨的任務(wù)。 這樣做的原因是,許多開發(fā)人員被教導(dǎo)要相信架構(gòu)設(shè)計(jì)必須由神秘知識(shí)的守護(hù)者來完成。 這些人稱為軟件架構(gòu)師。
但是, 任務(wù)本身并沒有聽起來那么復(fù)雜 :
軟件體系結(jié)構(gòu)是軟件系統(tǒng)的高層結(jié)構(gòu),創(chuàng)建這種高層結(jié)構(gòu)的準(zhǔn)則以及該結(jié)構(gòu)的文檔。
盡管經(jīng)驗(yàn)確實(shí)可以幫助我們創(chuàng)建更好的架構(gòu),但是架構(gòu)設(shè)計(jì)的基本工具實(shí)際上非常簡(jiǎn)單。 我們要做的就是遵循以下兩個(gè)原則:
1.關(guān)注點(diǎn)分離(SoC)原則
關(guān)注點(diǎn)分離(SoC)原則指定如下:
關(guān)注點(diǎn)分離(SoC)是一種用于將計(jì)算機(jī)程序分為不同部分的設(shè)計(jì)原理,這樣每個(gè)部分都可以解決一個(gè)單獨(dú)的關(guān)注點(diǎn)。
這意味著我們應(yīng)該:
換句話說,該原理將幫助我們確定所需的層以及每個(gè)層的職責(zé)。
2.保持簡(jiǎn)單愚蠢(KISS)原則
保持簡(jiǎn)單愚蠢(KISS)原則指出:
如果將大多數(shù)系統(tǒng)保持簡(jiǎn)單而不是使其變得復(fù)雜,則它們的工作效果最佳。 因此,簡(jiǎn)單性應(yīng)該是設(shè)計(jì)的主要目標(biāo),并且應(yīng)避免不必要的復(fù)雜性。
這個(gè)原則是理性的聲音。 它提醒我們,每個(gè)層都有價(jià)格,如果我們創(chuàng)建一個(gè)復(fù)雜的體系結(jié)構(gòu)而具有太多的層,則價(jià)格會(huì)太高。
換句話說, 我們不應(yīng)該設(shè)計(jì)這樣的架構(gòu) :
來源: Geek and Poke:足跡 – 根據(jù)CC 3.0許可
我認(rèn)為約翰,朱迪,馬克和戴維犯有手淫罪 。 他們遵循關(guān)注點(diǎn)分離原則,但忘記了最小化其體系結(jié)構(gòu)的復(fù)雜性。 可悲的是,這是一個(gè)常見的錯(cuò)誤,并且價(jià)格很高:
這就提出了一個(gè)明顯的問題:
什么樣的架構(gòu)可以很好地為我們服務(wù)?
每個(gè)人都應(yīng)該做到三層
如果考慮Web應(yīng)用程序的職責(zé),我們會(huì)注意到Web應(yīng)用程序具有以下“問題”:
- 它需要處理用戶的輸入并將正確的響應(yīng)返回給用戶。
- 它需要一個(gè)異常處理機(jī)制來向用戶提供合理的錯(cuò)誤消息。
- 它需要一種交易管理策略。
- 它需要同時(shí)處理身份驗(yàn)證和授權(quán)。
- 它需要實(shí)現(xiàn)應(yīng)用程序的業(yè)務(wù)邏輯。
- 它需要與使用的數(shù)據(jù)存儲(chǔ)和其他外部資源進(jìn)行通信。
我們可以通過僅使用“三層”來解決所有這些問題。 這些層是:
- Web層是Web應(yīng)用程序的最上層。 它負(fù)責(zé)處理用戶的輸入并將正確的響應(yīng)返回給用戶。 Web層還必須處理其他層引發(fā)的異常。 因?yàn)閃eb層是我們應(yīng)用程序的入口點(diǎn),所以它必須注意身份驗(yàn)證,并充當(dāng)防范未授權(quán)用戶的第一道防線。
- 服務(wù)層位于Web層下方。 它充當(dāng)事務(wù)邊界,同時(shí)包含應(yīng)用程序和基礎(chǔ)結(jié)構(gòu)服務(wù)。 應(yīng)用程序服務(wù)提供服務(wù)層的公共API。 它們還充當(dāng)交易邊界并負(fù)責(zé)授權(quán)。 基礎(chǔ)結(jié)構(gòu)服務(wù)包含“管道代碼”,該“管道代碼”與外部資源(例如文件系統(tǒng),數(shù)據(jù)庫(kù)或電子郵件服務(wù)器)進(jìn)行通信。 通常,不止一個(gè)應(yīng)用程序服務(wù)會(huì)使用這些方法。
- 存儲(chǔ)庫(kù)層是Web應(yīng)用程序的最低層。 它負(fù)責(zé)與使用的數(shù)據(jù)存儲(chǔ)進(jìn)行通信。
屬于特定層的組件可以使用屬于同一層或其下一層的組件。
經(jīng)典的Spring Web應(yīng)用程序的高級(jí)體系結(jié)構(gòu)如下所示:
我們要做的下一步是設(shè)計(jì)每一層的接口,這是我們遇到諸如數(shù)據(jù)傳輸對(duì)象(DTO)和域模型之類的術(shù)語的階段。 這些術(shù)語描述如下:
- 數(shù)據(jù)傳輸對(duì)象是一個(gè)僅是簡(jiǎn)單數(shù)據(jù)容器的對(duì)象,這些對(duì)象用于在不同進(jìn)程之間以及應(yīng)用程序各層之間承載數(shù)據(jù)。
- 域模型由三個(gè)不同的對(duì)象組成:
- 域服務(wù)是一種無狀態(tài)類,提供與域概念相關(guān)但不是實(shí)體或值對(duì)象的“自然”部分的操作。
現(xiàn)在我們知道了這些術(shù)語的含義,我們可以繼續(xù)設(shè)計(jì)每一層的接口。 讓我們一層一層地進(jìn)行檢查:
- Web層應(yīng)僅處理數(shù)據(jù)傳輸對(duì)象。
- 服務(wù)層將數(shù)據(jù)傳輸對(duì)象(和基本類型)作為方法參數(shù)。 它可以處理域模型對(duì)象,但只能將數(shù)據(jù)傳輸對(duì)象返回到Web層。
- 存儲(chǔ)庫(kù)層將實(shí)體(和基本類型)作為方法參數(shù),并返回實(shí)體(和基本類型)。
這就提出了一個(gè)非常重要的問題:
我們真的需要數(shù)據(jù)傳輸對(duì)象嗎? 為什么我們不能僅將實(shí)體和值對(duì)象返回到Web層?
這是一個(gè)壞主意有兩個(gè)原因:
經(jīng)典Spring Web應(yīng)用程序的“最終”架構(gòu)如下所示:
還有許多未解決的問題
這篇博客文章描述了Spring Web應(yīng)用程序的經(jīng)典體系結(jié)構(gòu),但未提供對(duì)真正有趣的問題的任何答案,例如:
- 為什么X層負(fù)責(zé)關(guān)注點(diǎn)Y?
- 我們的應(yīng)用程序應(yīng)該包含三層還是少于三層?
- 我們應(yīng)該如何設(shè)計(jì)每一層的內(nèi)部結(jié)構(gòu)?
這樣做的原因是簡(jiǎn)單的:
我們必須學(xué)會(huì)走路才能跑步 。
本教程的下一篇博客文章將回答這些問題。
翻譯自: https://www.javacodegeeks.com/2014/10/understanding-spring-web-application-architecture-the-classic-way.html
spring體系結(jié)構(gòu)
總結(jié)
以上是生活随笔為你收集整理的spring体系结构_了解Spring Web应用程序体系结构:经典方法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jax-rs/jersey_使用JAX-
- 下一篇: 高斯定理公式是什么 高斯定理公式是怎样的