<iframe align="top" marginwidth="0" marginheight="0" src="http://www.zealware.com/46860.html" frameborder="0" width="468" scrolling="no" height="60"></iframe>
有關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>所指定的頁面。</navigation-case></from-outcome></navigation-case></from-view-id></from-view-id></navigation-case></from-view-id></navigation-case></from-view-id></navigation-rule></navigation-rule>
2,請簡要的描述如何在BackingBean中擴展驗證器。
首先在
BackingBean
定義一個驗證方法,比如
nameValidator()
然后在
jsf
輸入組件的
validator
屬性中進行設置,例如
<inputsecret id="userInfo_name" value="#{userInfoAction.name}" required="true"></inputsecret>
validator="#{userInfoAction.nameValidator}"/>
3,JSF的事件處理包括:動作事件,即時事件,值變事件,phase事件,請用簡要描述jsf中的值變事件。
如果使用者改變了JSF輸入組件的值后,就會發生值變事。
如果您想要處理這個事件,有兩種方式,
一是直接設定JSF輸入組件的valueChangeListener屬性,例如
<selectonemenu value="#{user.locale}"></selectonemenu>
onchange="this.form.submit();"
valueChangeListener="#{user.changeLocale}">
另一個方法是實現javax.faces.event.ValueChangeListener接口,并定義其processValueChange()方法,
四,系統設計部分
1,請畫出DAO模式的UML類圖,并簡要描述該模式的原理以及適用范圍。
Dao模式,由于根據數據源不同,數據訪問也不同。根據存儲的類型(關系數據庫、面向對象數據庫、文件等等)和供應商實現不同,持久性存儲(比如數據庫)的訪問差別也很大。而且有時候我們的項目需要部署不同的數據庫,因此在這些情況下,可以使用Dao模式,
如圖所示,如果考慮為三種不同類型的數據庫來實現這個策略,我們可以考慮采用抽象工廠設計模式.假設.這個工廠創建了CustomerDAO,AccountDAO,OrderDAO的一系列的DAO,該策略運用了在抽象工廠中產生的工廠類中的工廠方法的實現.
如下圖所示:
<shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></path><lock aspectratio="t" v:ext="edit"></lock></shapetype><shape id="_x0000_i1025" style="WIDTH: 414.75pt; HEIGHT: 309pt" type="#_x0000_t75"><imagedata o:title="pic1" src="file:///D:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image001.png"></imagedata></shape>
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
進行通訊,從而簡化了它們之間的依賴關系。
<shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><span style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: " times new roman mso-fareast-font-family: sans unicode mso-ansi-language: mso-fareast-language: mso-bidi-language: ar-sa><shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><span style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: " times new roman mso-fareast-font-family: sans unicode mso-ansi-language: mso-fareast-language: mso-bidi-language: ar-sa><shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></path><lock aspectratio="t" v:ext="edit"></lock></shapetype><shape id="_x0000_i1025" style="WIDTH: 414.75pt; HEIGHT: 309pt" type="#_x0000_t75"><imagedata o:title="pic1" src="file:///D:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image001.png">類圖如下:</imagedata></shape></span></shapetype></span></shapetype>
<shapetype stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><span style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: " times new roman mso-fareast-font-family: sans unicode mso-ansi-language: mso-fareast-language: mso-bidi-language: ar-sa><shapetype stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><span style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: " times new roman mso-fareast-font-family: sans unicode mso-ansi-language: mso-fareast-language: mso-bidi-language: ar-sa><shape style="WIDTH: 414.75pt; HEIGHT: 309pt" type="#_x0000_t75"><imagedata o:title="pic1" src="file:///D:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image001.png"><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/HuDon/pic2.BMP"></imagedata></shape></span></shapetype></span></shapetype>
<shapetype stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><span style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: " times new roman mso-fareast-font-family: sans unicode mso-ansi-language: mso-fareast-language: mso-bidi-language: ar-sa><shapetype stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><span style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: " times new roman mso-fareast-font-family: sans unicode mso-ansi-language: mso-fareast-language: mso-bidi-language: ar-sa><shape style="WIDTH: 414.75pt; HEIGHT: 309pt" type="#_x0000_t75"><imagedata o:title="pic1" src="file:///D:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image001.png"><div style="TEXT-AUTOSPACE: ideograph-numeric">3,設計題:關于某一個系統的權限管理。業務規則如下</div> <div style="TEXT-AUTOSPACE: ideograph-numeric">(1) ,整個系統(包含多個模塊)有一個管理員,可以管理整個系統的權限管理;</div> <div style="TEXT-AUTOSPACE: ideograph-numeric">(2) ,每個模塊有自己的管理員,本模塊的管理員只能管理本模塊的權限。</div> <div style="TEXT-AUTOSPACE: ideograph-numeric">(3) ,某一個管理員是可以同時管理多個部門的。</div> <div style="TEXT-AUTOSPACE: ideograph-numeric">(4) ,管理員不能查看數據,只能查看文件狀態。員工可以查看數據以及文件的狀態。</div> <div style="TEXT-AUTOSPACE: ideograph-numeric">(5) ,管理員和管理員之間,管理員和普通員工之間允許相互調動。</div></imagedata></shape></span></shapetype></span></shapetype>
<shapetype stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><span style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: " times new roman mso-fareast-font-family: sans unicode mso-ansi-language: mso-fareast-language: mso-bidi-language: ar-sa><shapetype stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><span style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: " times new roman mso-fareast-font-family: sans unicode mso-ansi-language: mso-fareast-language: mso-bidi-language: ar-sa><shape style="WIDTH: 414.75pt; HEIGHT: 309pt" type="#_x0000_t75"><imagedata o:title="pic1" src="file:///D:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image001.png"><div style="TEXT-AUTOSPACE: ideograph-numeric">請使用UML工具設計一個簡單的管理系統</div> <div style="TEXT-AUTOSPACE: ideograph-numeric"></div> <div style="TEXT-AUTOSPACE: ideograph-numeric">用例圖如下:</div> <div style="TEXT-AUTOSPACE: ideograph-numeric"><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/HuDon/pic3.BMP"></div> <div style="TEXT-AUTOSPACE: ideograph-numeric"> <div><span style="COLOR: blue">類圖如下:</span></div> <div><span style="COLOR: blue"><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/HuDon/pic4.BMP"></span></div> <div><span style="COLOR: blue"><div> <span style="COLOR: blue">DepartmentManager</span><span style="COLOR: blue">類記錄管理員和部門之間的管理關系</span> </div> <div> <span style="COLOR: blue">Authorities</span><span style="COLOR: blue">類定義不同角色所擁有的不同權限,例如員工可以讀文件,管理員可以看到文件狀態等。</span> </div> <div> <span style="COLOR: blue">EmployeeActorLog </span><span style="COLOR: blue">:定義員工的角色。</span> </div> <div><span style="COLOR: blue"><div style="TEXT-AUTOSPACE: ideograph-numeric">4,Anne的寵物小屋有12個籠子,每個籠子可以放不同的動物,但只能放1只或0只,包括貓Cat,狗Dog,蛇Snake.請使用UML工具設計一個簡單的管理系統,可增加、刪除籠子中的寵物,查詢每個籠子中存放的寵物類型,(包括籠子為空的情況),統計籠中寵物的種類和數量。</div> <div><span style="COLOR: blue"><div><span style="COLOR: blue">類圖--用例圖如下:</span></div> <div> <span style="COLOR: blue">CoopManager</span><span style="COLOR: blue">為管理類,管理籠子中的動物。</span> </div></span></div></span></div></span></div> <div><span style="COLOR: blue"><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/HuDon/pic5.BMP"></span></div> <div><span style="COLOR: blue"><div style="TEXT-AUTOSPACE: ideograph-numeric">5,論述JSH的開發經驗(JSH: jsf + srping + hiberante)</div> <div style="TEXT-AUTOSPACE: ideograph-numeric"> <span> </span>描述自己曾經參與過的JSH項目,以及自己在項目中所處的角色,擔任的主要工作。</div> <div style="TEXT-INDENT: 21pt; TEXT-AUTOSPACE: ideograph-numeric">結合自己實際參與過的JSH項目,談談自己對JSH項目的理解。</div></span></div> <div><span style="COLOR: blue"></span></div> <div><span style="COLOR: blue"></span></div> <div><span style="COLOR: blue"></span></div> <div><span style="COLOR: blue"></span></div> <div><span style="COLOR: blue"></span></div> <div><span style="COLOR: blue"></span></div> <div><span style="COLOR: blue"></span></div> <div><span style="COLOR: blue"></span></div> <div><span style="COLOR: blue"></span></div> <div><span style="COLOR: blue"></span></div> <div><span style="COLOR: blue"></span></div> <div><span style="COLOR: blue"></span></div> <div><span style="COLOR: blue"></span></div> <div><span style="COLOR: blue"></span></div> <div><span style="COLOR: blue"></span></div> <div><span style="COLOR: blue"></span></div> </div></imagedata></shape></span></shapetype></span></shapetype>
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1782817