java基礎設計 開源架構

來源:互聯網
上載者:User

  有關java各種架構的基礎設計,筆者經驗之談,算是小結吧!:)

一, Hibernate 部分1,簡述hibernate映射繼承關係和映射組成關係有何異同?映射繼承關係:類和類之間除了關聯和聚集關係外,還可以有繼承關係。什麼時候需要映射繼承關係呢,舉個例 --子,一個公司裡面有不同種類的員工,這些不同種類的員工都有一些共同的屬性,可以放在一個Employee類中,而員工的個性(不同的地方)可以放在Employee類的子類中,在映射Employee類時,需要用discriminate關鍵字來映射員工的類型,而用subclass關鍵字來映射Empoyee的子類。映射組成關係:有一些類是有幾個部分類組成的,例如一個顧客,可能有家庭住址和辦公地址,每個地址的屬性又是一樣的,因此可以在映射顧客類的時候,抽象出一個地址類來,這樣可以實現更細粒度的映射,在映射組成關係時,要使用component關鍵字來映射屬性類。 2,簡述在hibernate映射時,lazy屬性有何意義?首先hibernate 作對象裝載的時候,在預設的情況下是需要把對象相關的資訊全部讀出來的。這樣後面的應用程式才能夠直接存取這些值。
這樣如果a 關聯了 b, c;那麼b,c 都會被裝進來。如果b 還關聯了d,e,f 。那麼d,e,f 也會被裝進來。如果對象設計不好,貪圖方便,大家互相關聯的話,那麼拖進來的資訊將非常巨大,甚至可能讀一個簡單的資訊,把整個資料庫給拖進來了。那自然會造成系統崩潰,效能很差等問題。即使設計得好,這個問題也很嚴重。因此需要lazy 。lazy 表示在第一次裝載的時候不要裝,用到什麼裝什麼。  3,請為最佳化hibernate提幾點建議1,不要把所有的責任推在hibernate上,對代碼進行重構,減少對資料庫的操作,盡量避免在資料庫查詢時使用in操作,以及避免遞迴查詢操作,代碼品質、系統設計的合理性決定系統效能的高低。2,對大資料量查詢時,慎用list()或者iterator()返回查詢結果,而應該結合HQL按需進行查詢。3,在一對多、多對一的關係中,使用消極式載入機制,會使不少的對象在使用時方會初始化,這樣可使得節省記憶體空間以及減少資料庫的負荷,而且若PO中的集合沒有被使用時,就可減少互資料庫的互動從而減少處理時間。4,對於大資料量新增、修改、刪除操作或者是對大資料量的查詢,與資料庫的互動次數是決定處理時間的最重要因素,減少互動的次數是提升效率的最好途徑,所以在開發過程中,請將show_sql設定為true,深入瞭解Hibernate的處理過程,嘗試不同的方式,可以使得效率提升。  二, spring 部分1,簡述什麼是IOC, IOC有哪幾種注入方式?IOC指控制反轉,或者說是依賴注入,控制反轉是指獲得依賴對象的方式反轉了,任何重要的系統都需要至少兩個相互合作的類來完成商務邏輯,通常情況下,每個對象都要自己負責得到它的合作對象,這樣會導致代碼耦合度高,而難以測試,難以維護,難以擴充。使用IOC,對象的依賴都是在對象建立時由負責協調系統中各個對象的外部實體提供,這就是依賴被注入到對象中,實現了對象之間解耦 2,簡述什麼是AOP ,AOP會影響效能嗎?AOP 面向方面的編程。傳統的OOP能夠很好的避免代碼的重複。但是有的時候,我們無法用OOP避免代碼的重複,或者無法使用OOP得到一個優雅的解決方案,例如事務,安全,異常等,我們程式中的每一個方法幾乎都會和它們打交道,有沒有什麼辦法就像EJB中一樣,能講這些方面模組化呢。AOP出現了,它將系統分解為方面和關注點,而不是對象,它將橫切性的問題以一種更加通用的方式模組化,從而提升程式的模組化程度。舉個例子,如果我們系統中的某一些方法都需要安全檢查,安全檢查對我們來說就是一個方面,我們可以將這些需要安全檢查方法的某個切入點進行攔截,然後進行注入通知,從而將安全檢查的代碼(通知)放入一個函數中,而不用到處充滿安全檢查的代碼。AOP是通過反射機制來實現攔截,因此會影響效能,但是相對於EJB來說,對效能的影響不會很嚴重。因此我們在使用AOP時要注意使用的粒度,建議不要在非常細粒度的情況下使用AOP  3,簡述spring是如何管理hibernate事務的?Spring和EJB一樣,也提供了聲明性事務支援,spring使用了一種回調方式,把真實的事務實現從代碼中抽離出來,它可以使用JTA的交易管理支援,也可以使用hibernate本身機制所提供的事務支援。另外還可以使用AOP將交易管理抽離出來放在一個專門的交易管理員中進行管理。 4,簡述Acegi是如何?: 根據資料庫驗證身份的。Acegi在驗證客戶身份時需要先在資料庫中建一個users表和authorities表,Acegi會根據客戶輸入的資訊使用一個jdbc Dao在Users表中尋找username和password ,如果客戶輸入的資訊正確,則Acegi在authorities表中尋找該客戶所擁有的許可權,從而完成了認證的工作。  三, JSF 部分1,簡述JSF是如何?頁面跳轉的首先在jsf設定檔中的BacingBean配置一個頁面跳轉規則<navigation-rule> ,<navigation-rule> 中會包含一個<from-view-id>和一系列的<navigation-case> 。<from-view-id>代表當前頁面,而<navigation-case>代表一些列可能跳轉的頁面,當該BackingBean中的某個方法返回一個字串時,它會去根據當前頁面去匹配<from-view-id>,如果找到了當前的頁面,然後就會根據返回的字串去匹配該<from-view-id>對應的一系列<navigation-case>中的<from-outcome>標籤所包含的字串,找到匹配的字串後,則會從當前頁面跳轉到<navigation-case>所指定的頁面。   2,請簡要的描述如何在BackingBean中擴充驗證器。首先在BackingBean定義一個驗證方法,比如nameValidator()然後在jsf輸入組件的 validator 屬性中進行設定,例如<h:inputSecret id="userInfo_name" value="#{userInfoAction.name}" required="true"                validator="#{userInfoAction.nameValidator}"/>  3,JSF的事件處理包括:動作事件,即時事件,值變事件,phase事件,請用簡要描述jsf中的值變事件。如果使用者改變了JSF輸入組件的值後,就會發生值變事。如果您想要處理這個事件,有兩種方式,一是直接設定JSF輸入組件的valueChangeListener屬性,例如<h:selectOneMenu value="#{user.locale}"onchange="this.form.submit();"valueChangeListener="#{user.changeLocale}">另一個方法是實現javax.faces.event.ValueChangeListener介面,並定義其processValueChange()方法, 

四,系統設計部分1,請畫出DAO模式的UML類圖,並簡要描述該模式的原理以及適用範圍。Dao模式,由於根據資料來源不同,資料訪問也不同。根據儲存的類型(關聯式資料庫、物件導向資料庫、檔案等等)和供應商實現不同,持久性儲存(比如資料庫)的訪問差別也很大。而且有時候我們的項目需要部署不同的資料庫,因此在這些情況下,可以使用Dao模式, ,如果考慮為三種不同類型的資料庫來實現這個策略,我們可以考慮採用抽象工廠設計模式.假設.這個工廠建立了CustomerDAO,AccountDAO,OrderDAO的一系列的DAO,該策略運用了在抽象工廠中產生的工廠類中的Factory 方法的實現.如所示:


 

   2,如下源碼所示,UserManager 和 AccountManager相互依賴對方,public class UserManager {       AccountManager accountManager = new AccountManager();       public User searchByNameUser(String userName){              ...................       }       public void doSomeUserThings(){              Long id = ........              accountManager.searchAccountById(id);              ........................       }}public class AccountManager {       UserManager userManager = new UserManager();       public Account searchAccountById(Long id){              ..............       }       public void doSomeAccountThings(){              ........................              String userName = "tom";              userManager.searchByNameUser(userName);              ........................       }}(1),請問這種設計好嗎,如果使用spring IOC 會出現什麼問題,請說明原因。(2),請重新為該系統進行設計(不用寫代碼),用UML類圖進行說明。(1)AccountManager和 UserManager 兩個類相互依賴對方,兩個之間相互耦合,執行個體化一方的時候必須執行個體化另外一方,會造成循環相依性,無限依賴,程式運行時會報錯。如果使用IOC,則spring不知道會先初始化誰而報錯(2)解決辦法:當你需要構建一個階層的子系統時,使用Facade模式定義子系統中每層的進入點,如果子系統之間是相互依賴的,你可以讓它們僅通過Facade進行通訊,從而簡化了它們之間的依賴關係。 
類圖如下:  

3,設計題:關於某一個系統的許可權管理。商務規則如下(1) ,整個系統(包含多個模組)有一個管理員,可以管理整個系統的許可權管理;(2) ,每個模組有自己的管理員,本模組的管理員只能管理本模組的許可權。(3) ,某一個管理員是可以同時管理多個部門的。(4) ,管理員不能查看資料,只能查看檔案狀態。員工可以查看資料以及檔案的狀態。(5) ,管理員和管理員之間,管理員和普通員工之間允許相互調動。

 

請使用UML工具設計一個簡單的管理系統使用案例圖如下: 

類圖如下: 

DepartmentManager類記錄管理員和部門之間的管理關聯性Authorities類定義不同角色所擁有的不同許可權,例如員工可以讀檔案,管理員可以看到檔案狀態等。EmployeeActorLog :定義員工的角色。 

4,Anne的寵物小屋有12個籠子,每個籠子可以放不同的動物,但只能放1隻或0隻,包括貓Cat,狗Dog,蛇Snake.請使用UML工具設計一個簡單的管理系統,可增加、刪除籠子中的寵物,查詢每個籠子中存放的寵物類型,(包括籠子為空白的情況),統計籠中寵物的種類和數量。 

類圖--使用案例圖如下:CoopManager為管理類,管理籠子中的動物。

 

5,論述JSH的開發經驗(JSH: jsf + srping + hiberante)    描述自己曾經參與過的JSH項目,以及自己在項目中所處的角色,擔任的主要工作。結合自己實際參與過的JSH項目,談談自己對JSH項目的理解。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.