2011-04-21 146 views
47

我是擁有近5年Struts,Spring和Hibernate經驗的Java開發人員。如何設計和構建Java/Java EE Web應用程序?

我們有一個新項目在幾天內出現。我們有完整的需求,我們將使用Spring MVC,Spring和Hibernate來完成這個項目。

我被要求設計和構建整個Web應用程序。設計和創建一個建築師是我迄今爲止在我職業生涯中還沒有做過的事情。而且我不知道該怎麼做,以及從哪裏開始,使用什麼工具等等。我甚至不知道A,B,C的設計和建築。

您可能想知道我爲什麼甚至要求在第一時間做到這一點。事情是我有機會做到這一點,在每個階段我都會受到監控,我會讓我的前輩們審查設計。

因此,歡迎任何建議,想法和步驟開始和繼續。

+5

在你過去5年的經驗,任何項目設計文件給你開發或任何與建築師的討論? Bascially檢查任何軟件設計/架構書籍的基本理解。您需要從使用案例場景的需求開始,然後從序列圖,系統架構設計,組件圖,類圖和數據庫設計開始。取決於你的工作場所的實踐,你可能需要一些額外的文件或更少的文件。但是,這是基本的最小設定。 – Senthil 2011-04-21 03:21:17

+0

我到目前爲止工作過的項目中還沒有任何設計文檔:-(。因此,它對我來說看起來更加艱難 – ashishjmeshram 2011-04-21 03:24:20

回答

110

我可以從我自己的經驗加上我的2美分(雖然它更多的發展的最佳做法彙編,你可能會發現它很有用,讓他們記在設計你的應用程序):

  • 有沒有萬能的設計
  • 儘量保持應用程序儘可能輕。
  • 使用Maven/Gradle管理依賴關係
    • 不要過度依賴IDE。確保你的項目沒有IDE(如果你使用的是Maven/Gradle,它會:)試着用IDEA,Netbeans和Eclipse打開你的項目。
  • 對於上述技術,appfuse是一個很好的起點。
  • 首先設計您的數據庫/實體
  • 明智而明智地使用庫。不要過度使用它們。
  • 不要忘了寫的JUnit/TestNG的(至少對於業務層)上的所有主流瀏覽器
  • 測試的應用程序(不只是你最喜歡的一個:)
  • 確定共有多少用戶和多少個併發用戶的Web應用程序將有。
    • 然後決定是否需要緩存。
    • 您將使用應用服務器羣集或不使用。
  • 選擇基於其能力的應用服務器和更重要的是「您的需求」
    • 的Tomcat /碼頭是絕對沒使用任何應用程序服務器特定的API大多數情況下
  • 避免
  • 即使使用hibernate作爲JPA實現,也使用JPA接口/註釋
  • 在實體中映射關係時要格外小心。決定哪些屬性和關係會延遲加載,哪些會急切加載
  • 在設計應用程序時要牢記應用程序安全性。春季安全是極好的選擇。
  • 千萬不要濫用HttpSession。不要在其中存儲太多。
  • 保持實體可序列化。強制開發人員使用toString(),hashCode()和equals()
  • 不要忘記從第1天開始使用版本控制
  • 不要僅僅假設spring/hibernate/spring-mvc將是您的最佳選擇。用至少3到4個選項創建概念的小樣本。
  • 嘗試自動化集成/編譯/ CI工具如詹金斯
  • 檢查和調整SQL由Hibernate(不定期)產生
  • 不要讓商業邏輯蔓延到視圖層部署。討厭jsp scriptlets?考慮速度/ Freemarker。 JSP不是唯一的選擇。
  • 通過使用Spring的PropertyPlaceholderConfigurator來外部化特定於環境的配置。
  • 如果可能,嘗試與現有的用戶認證機制(如LDAP/OpenID)集成,而不是自己寫。這可以幫助您避免重新發明輪子,讓用戶無法記住另一組用戶名和密碼。
+0

謝謝Kunal,它相當令人印象深刻。如果可能,請使用自上次更新以來可能獲得的有用發現進行更新。 RGDS。 – 2016-12-22 11:58:23

+0

我也建議制定一個計劃,從週期的早期開始引入性能測試/調優。將性能測試早期引入到設計和開發中,可以讓您有足夠的時間去改變,如果有需要的話。 – YogendraJ 2017-01-09 20:25:54

4

閱讀推動「恰到好處」建模的敏捷建模網站。他們有一些很好的指導方針,包括從需求收集到設計/開發的完整「敏捷建模過程」。

http://www.agilemodeling.com/

http://www.agilemodeling.com/essays/amdd.htm

http://www.agilemodeling.com/essays/agileArchitecture.htm

http://www.agilemodeling.com/essays/agileAnalysis.htm

http://www.agilemodeling.com/essays/agileDesign.htm

至於工具,我愛視覺範式。它相對便宜(與其他工具相比)。有各種各樣的免費建模工具(谷歌是你的朋友),但沒有比較視覺範式,只是它的成本,它是非常值得的。如果我的僱主沒有爲此付出現金,我會自己購買... :)

+0

也許你還在Enterprise Architect(http://www.sparxsystems.com.au /)進行建模 - 這是我所知道的最好的圖表工具(來自可用性POV)。有一個有時間限制的全功能演示可用,許可證費用也可以承受。 – BertNase 2011-04-21 04:25:08

+0

我也喜歡EA。我更喜歡副總裁:)兩者都是大致相同價位的優秀工具。坦率地說,我認爲兩者都遠勝於大多數昂貴得多的工具。 – squawknull 2011-04-21 04:36:17

13

有幾件事情需要用於架構設計文檔。不是一件容易的事,而是要抓住機會的道路。由於這是一個很大的問題,希望這些鏈接可以讓你開始,並且在你弄溼腳後你可以改進問題。

方法

你使用會影響你採取什麼樣的任務,在第一次的方法。 Waterfall是一種流行但過時的方法。一種更新的方法是具有幾個面孔的敏捷。我最喜歡的是Scrum Agile用於開發任何尺寸的軟件。

圖表

Diagrams是最有力的方式來表示該系統作爲一個整體,作爲單獨的組件之一。您創建的圖表類型取決於系統。通常有結構圖,行爲圖,交互圖和其他噸。這些圖表顯示了整個系統的各個部分,每個部分的物理佈局和/或邏輯佈局,通信流程,程序流程等。

文檔

文檔就像它的聲音,有項目說明,範圍,用戶案例,順序圖,並描述該項目或項目件的任何其他文件的文檔和文件。

3

看看羅伯特馬丁的(又名叔叔鮑勃)乾淨的建築。 Here's快速瀏覽。 使用這種方法,您將能夠能夠推遲像Spring或Hibernate的細節,以便更多時間關注業務邏輯。甚至可以從Spring遷移到Java EE,而無需觸及您的業務和應用程序邏輯。您還將獲得符合SOLID原則的可測試應用程序,而無需太多額外的工作。

我剛剛用這種方式創建了一個應用程序,我必須說我非常滿意它。我可以輕鬆地將其移植到桌面或移動應用程序,或者更換存儲模塊。取決於政策的細節有很長的路要走。它還以API的方式促進思考,並在正確應用時使模塊可重用。

馬丁說盡可能多的細節像框架是討厭的,而不是你的架構的一部分。我確實認爲他們屬於建築,但只屬於不同的層次。通常情況下,您希望在早期階段包含框架,以便能夠生成一小段工作應用程序,以便向用戶演示。或者當你事先知道你的框架,並且沒有關於它們的討論時,就像我的情況一樣。但是,如果將它們結合在一起來創建應用程序體系結構,您可以將其視爲單獨的軟件體系結構

+0

睡鼠,我真的很想和你談談Clean Architecure,因爲你已經掌握了它的實際......我以最好的方式實現輸入和輸出模型/端口。我在這裏嘗試了一個簡單的秒殺:https://github.com/ramonchiara/CleanArchSpike。你能給我一個反饋嗎?是否允許在這裏發佈我們的個人聯繫人? – 2014-06-24 12:38:34

+0

我已在您的網站發佈了評論:) – Dormouse 2014-07-03 13:21:15

-2

我編寫了一本關於Spring,Hibernate和數據建模的新書,它將回答您對Java EE Web應用程序設計方面的查詢。通常,Java EE Web應用程序有5層 - 客戶端,演示文稿,業務服務,數據訪問和資源(實體)。本書着重介紹如何通過使用Spring和Hibernate的所有關係數據建模來設計和開發這些層。作爲一個下載,整個Web應用程序被給出,您可以在其中找到有關管理數據建模場景的每個關係的信息。

讓我們看看一個簡單的獨立實體。爲了管理實體,必須設計創建,讀取,更新,刪除和查找所有記錄等方法。所以如果我們自下而上,實體創造就是第一步。接下來我們看看有上面描述的方法的Repository。更進一步的是業務服務層,然後是基於JSON的REST Spring控制器。剩下的任務涉及編寫JSP頁面和JQuery AJAX調用REST控制器。

你可以找到關於這本書的更多信息here

+0

雖然此鏈接可能回答此問題,但最好在此處包含答案的重要部分並提供供參考的鏈接。如果鏈接頁面更改,則僅鏈接答案可能會失效。 – DB5 2014-11-02 18:52:41

+0

修改了帖子,以包括更多的肉 – 2014-11-02 19:06:22

-1

more details

  1. 着手進行編碼得到的業務需求下來之前。構建完整的請求功能列表,樣例屏幕截圖(如果可用),用例圖,業務規則等作爲功能規範文檔。這是業務分析師和開發人員將會詢問關於用戶界面需求,數據層集成需求,用例等的問題的階段。還要根據實現所需的業務目標,交付週期和迭代優先考慮功能。

  2. 根據功能規格準備技術規格文件。技術規範文件應包括: 文件目的:例如該文件將強調客戶服務功能。 概述:本部分主要介紹背景信息,範圍,任何包含和/或排除,參考文檔等。 基本體系結構:討論或引用基準體系結構文檔。回答問題喜歡它會縮放嗎?這個表現能夠得到改善嗎?它是否可擴展和/或可維護?是否有任何安全問題?描述要在早期迭代中使用的垂直切片,以及要由每個切片證明的概念。等等,例如我們應該使用哪種MVC [model-1,model-2 etc]範例?我們應該使用Struts,JSF和Spring MVC等,還是構建我們自己的框架?我們是否應該使用業務代表來將中間層與客戶端層分開?我們應該使用AOP(面向方面​​編程)嗎?我們應該使用依賴注入嗎?我們應該使用註釋嗎?我們需要國際化嗎?等等 假設,依賴,風險和問題:突出所有的假設,依賴關係,風險和問題。例如,列出您可識別的所有風險。 每個關鍵功能要求的設計選擇。還討論爲什麼選擇一個特定的設計替代方案。這個過程將鼓勵開發人員分析可能的設計方案,而不必跳過顯而易見的解決方案,這可能並不總是最好的解決方案。處理邏輯:討論客戶層,中間層和數據層的處理邏輯。在需要時添加工藝流程圖。添加任何預處理條件和/或後處理條件。 將設計傳達給開發人員,解決方案設計師,架構師等的UML圖。通常需要類圖和序列圖。其他圖表可能會添加任何特殊情況。 狀態圖圖:用於描述跨多個用例的對象行爲 活動圖:用於表示複雜操作。支持並鼓勵並行行爲。活動和狀態圖表對於使用多線程編程的工作流建模非常有用。 協作和時序圖:當您想查看單個用例中多個對象的行爲時,請使用協作或時序圖。如果您想跨多個用例查看單個對象,請使用狀態圖。對象圖:對象圖顯示實例而不是類。它們對於詳細解釋一些複雜的對象非常有用,例如突出顯示遞歸關係。 以表格形式列出軟件包名稱,類名稱,數據庫名稱和表格名稱及其責任的簡要描述。

  3. 準備整個團隊的編碼標準文件,以提高一致性和效率。某些編碼實踐可能會降低性能,例如: 不恰當地使用String類。對於計算密集型突變,請使用StringBuffer而不是String。 接口方面的代碼。例如,您可能會決定LinkedList是某些應用程序的最佳選擇,但稍後決定ArrayList可能是更好的選擇。 錯誤的方法 ArrayList list = new ArrayList(); 正確的方法 List list = new ArrayList(100); 適當地設置集合的初始容量(例如ArrayList,HashMap等)。 爲促進一致性定義變量名稱,方法名稱,使用日誌記錄,大括號位置等標準。
  4. 爲整個團隊準備代碼審閱文檔和模板。讓我們看看代碼審查應包含的一些要素: 正確的變量聲明:例如實例與靜態變量,常量等 性能問題:例如當沒有線程安全問題時,使用ArrayList,HashMap等代替Vector,Hashtable。 內存問題:例如對象的實例化不對象而不是對象重用和對象池,不會在finally塊中關閉有價值的資源等。 線程安全問題:例如諸如SimpleDateFormat,Calendar,DecimalFormat等Java API類不是線程安全的,在JSP中聲明變量不是線程安全的,在Struts操作類或多線程Servlet中存儲狀態信息不是線程安全的。 錯誤處理:例如在沒有嵌套原始異常的情況下重新拋出異常,不引發EJB異常的EJB方法用於系統異常等。 使用編碼標準:例如不使用框架,使用System.out代替log4j等。 設計問題:沒有重用代碼,沒有明確的責任分離,無效的繼承使用以獲得方法重用,servlet執行JDBC直接訪問而不是使用DAO數據訪問對象)類,Struts操作或servlet類中的HTML代碼,用作實用程序類而不是流程控制器的servlet等。 代碼文檔:例如沒有評論,沒有頭文件等。 錯誤:例如在容器管理的事務中調用setAutoCommit,使用二進制或「|」而不是邏輯或「||」,依靠EJB遠程調用中的傳遞引用,ResultSet不會被異常關閉,EJB方法不會爲系統異常拋出EJBException等等。
  5. 按照團隊要求分享的要求準備額外的可選準則文件。這將促進一致性和標準。例如: 設置J2EE開發環境的指導原則。 版本控制系統指南(CVS,VSS等)。 部署步驟指導,環境設置,螞蟻目標等。 數據建模指南(任何公司標準)。 錯誤處理指南。 用戶界面設計指南。 項目概述文件,軟件開發過程文檔等