<iframe align="top" marginwidth="0" marginheight="0" src="http://www.zealware.com/46860.html" frameborder="0" width="468" scrolling="no" height="60"></iframe>
有關(guān)java各種框架的基礎(chǔ)設(shè)計,筆者經(jīng)驗之談,算是小結(jié)吧!:)
一,
Hibernate
部分
1,簡述hibernate映射繼承關(guān)系和映射組成關(guān)系有何異同?
映射繼承關(guān)系:類和類之間除了關(guān)聯(lián)和聚集關(guān)系外,還可以有繼承關(guān)系。什么時候需要映射繼承關(guān)系呢,舉個例 --子,一個公司里面有不同種類的員工,這些不同種類的員工都有一些共同的屬性,可以放在一個
Employee
類中,而員工的個性(不同的地方)可以放在
Employee
類的子類中,在映射
Employee
類時,需要用
discriminate
關(guān)鍵字來映射員工的類型,而用
subclass
關(guān)鍵字來映射
Empoyee
的子類。
映射組成關(guān)系:有一些類是有幾個部分類組成的,例如一個顧客,可能有家庭住址和辦公地址,每個地址的屬性又是一樣的,因此可以在映射顧客類的時候,抽象出一個地址類來,這樣可以實現(xiàn)更細(xì)粒度的映射,在映射組成關(guān)系時,要使用
component
關(guān)鍵字來映射屬性類。
2,簡述在hibernate映射時,lazy屬性有何意義?
首先
hibernate
作對象裝載的時候,在缺省的情況下是需要把對象相關(guān)的信息全部讀出來的。
這樣后面的應(yīng)用程序才能夠直接訪問這些值。
這樣如果
a
關(guān)聯(lián)了
b, c
;那么
b,c
都會被裝進(jìn)來。
如果
b
還關(guān)聯(lián)了
d,e,f
。
那么
d,e,f
也會被裝進(jìn)來。
如果對象設(shè)計不好,貪圖方便,大家互相關(guān)聯(lián)的話,那么拖進(jìn)來的信息將非常巨大,甚至可能讀一個簡單的信息,把整個數(shù)據(jù)庫給拖進(jìn)來了。
那自然會造成系統(tǒng)崩潰,性能很差等問題。
即使設(shè)計得好,這個問題也很嚴(yán)重。
因此需要
lazy
。
lazy
表示在第一次裝載的時候不要裝,用到什么裝什么。
3,請為優(yōu)化hibernate提幾點建議
1,
不要把所有的責(zé)任推在
hibernate
上,對代碼進(jìn)行重構(gòu),減少對數(shù)據(jù)庫的操作,盡量避免在數(shù)據(jù)庫查詢時使用
in
操作,以及避免遞歸查詢操作,代碼質(zhì)量、系統(tǒng)設(shè)計的合理性決定系統(tǒng)性能的高低。
2,
對大數(shù)據(jù)量查詢時,慎用
list()
或者
iterator()
返回查詢結(jié)果,而應(yīng)該結(jié)合
HQL
按需進(jìn)行查詢。
3,
在一對多、多對一的關(guān)系中,使用延遲加載機制,會使不少的對象在使用時方會初始化,這樣可使得節(jié)省內(nèi)存空間以及減少數(shù)據(jù)庫的負(fù)荷,而且若
PO
中的集合沒有被使用時,就可減少互數(shù)據(jù)庫的交互從而減少處理時間。
4,
對于大數(shù)據(jù)量新增、修改、刪除操作或者是對大數(shù)據(jù)量的查詢,與數(shù)據(jù)庫的交互次數(shù)是決定處理時間的最重要因素,減少交互的次數(shù)是提升效率的最好途徑,所以在開發(fā)過程中,請將
show_sql
設(shè)置為
true
,深入了解
Hibernate
的處理過程,嘗試不同的方式,可以使得效率提升。
二,
spring
部分
1,簡述什么是IOC, IOC有哪幾種注入方式?
IOC
指控制反轉(zhuǎn),或者說是依賴注入,控制反轉(zhuǎn)是指獲得依賴對象的方式反轉(zhuǎn)了,任何重要的系統(tǒng)都需要至少兩個相互合作的類來完成業(yè)務(wù)邏輯,通常情況下,每個對象都要自己負(fù)責(zé)得到它的合作對象,這樣會導(dǎo)致代碼耦合度高,而難以測試,難以維護(hù),難以擴(kuò)展。使用
IOC,
對象的依賴都是在對象創(chuàng)建時由負(fù)責(zé)協(xié)調(diào)系統(tǒng)中各個對象的外部實體提供,這就是依賴被注入到對象中,實現(xiàn)了對象之間解耦
2,簡述什么是AOP ,AOP會影響性能嗎?
AOP
面向方面的編程。
傳統(tǒng)的
OOP
能夠很好的避免代碼的重復(fù)。但是有的時候,我們無法用
OOP
避免代碼的重復(fù),或者無法使用
OOP
得到一個優(yōu)雅的解決方案,例如事務(wù),安全,異常等,我們程序中的每一個方法幾乎都會和它們打交道,有沒有什么辦法就像
EJB
中一樣,能講這些方面模塊化呢。
AOP
出現(xiàn)了,它將系統(tǒng)分解為方面和關(guān)注點,而不是對象,它將橫切性的問題以一種更加通用的方式模塊化,從而提升程序的模塊化程度。
舉個例子,如果我們系統(tǒng)中的某一些方法都需要安全檢查,安全檢查對我們來說就是一個方面,我們可以將這些需要安全檢查方法的某個切入點進(jìn)行攔截,然后進(jìn)行注入通知,從而將安全檢查的代碼(通知)放入一個函數(shù)中,而不用到處充滿安全檢查的代碼。
AOP
是通過反射機制來實現(xiàn)攔截,因此會影響性能,但是相對于
EJB
來說,對性能的影響不會很嚴(yán)重。因此我們在使用
AOP
時要注意使用的粒度,建議不要在非常細(xì)粒度的情況下使用
AOP
3,簡述spring是如何管理hibernate事務(wù)的?
Spring
和
EJB
一樣,也提供了聲明性事務(wù)支持,
spring
使用了一種回調(diào)方式,把真實的事務(wù)實現(xiàn)從代碼中抽離出來,它可以使用
JTA
的事務(wù)管理支持,也可以使用
hibernate
本身機制所提供的事務(wù)支持。另外還可以使用
AOP
將事務(wù)管理抽離出來放在一個專門的事務(wù)管理器中進(jìn)行管理。
4,簡述Acegi是如何實現(xiàn): 根據(jù)數(shù)據(jù)庫驗證身份的。
Acegi
在驗證客戶身份時需要先在數(shù)據(jù)庫中建一個
users
表和
authorities
表,
Acegi
會根據(jù)客戶輸入的信息使用一個
jdbc Dao
在
Users
表中查找
username
和
password
,如果客戶輸入的信息正確,則
Acegi
在
authorities
表中查找該客戶所擁有的權(quán)限,從而完成了認(rèn)證的工作。
三,
JSF
部分
1,簡述JSF是如何實現(xiàn)頁面跳轉(zhuǎn)的
首先在
jsf
配置文件中的
BacingBean
配置一個頁面跳轉(zhuǎn)規(guī)則
<navigation-rule> ,<navigation-rule> 中會包含一個<from-view-id>和一系列的<navigation-case> 。<from-view-id>代表當(dāng)前頁面,而<navigation-case>代表一些列可能跳轉(zhuǎn)的頁面,當(dāng)該BackingBean中的某個方法返回一個字符串時,它會去根據(jù)當(dāng)前頁面去匹配<from-view-id>,如果找到了當(dāng)前的頁面,然后就會根據(jù)返回的字符串去匹配該<from-view-id>對應(yīng)的一系列<navigation-case>中的<from-outcome>標(biāo)簽所包含的字符串,找到匹配的字符串后,則會從當(dāng)前頁面跳轉(zhuǎn)到<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中擴(kuò)展驗證器。
首先在
BackingBean
定義一個驗證方法,比如
nameValidator()
然后在
jsf
輸入組件的
validator
屬性中進(jìn)行設(shè)置,例如
<inputsecret id="userInfo_name" value="#{userInfoAction.name}" required="true"></inputsecret>
validator="#{userInfoAction.nameValidator}"/>
3,JSF的事件處理包括:動作事件,即時事件,值變事件,phase事件,請用簡要描述jsf中的值變事件。
如果使用者改變了JSF輸入組件的值后,就會發(fā)生值變事。
如果您想要處理這個事件,有兩種方式,
一是直接設(shè)定JSF輸入組件的valueChangeListener屬性,例如
<selectonemenu value="#{user.locale}"></selectonemenu>
onchange="this.form.submit();"
valueChangeListener="#{user.changeLocale}">
另一個方法是實現(xiàn)javax.faces.event.ValueChangeListener接口,并定義其processValueChange()方法,
四,系統(tǒng)設(shè)計部分
1,請畫出DAO模式的UML類圖,并簡要描述該模式的原理以及適用范圍。
Dao模式,由于根據(jù)數(shù)據(jù)源不同,數(shù)據(jù)訪問也不同。根據(jù)存儲的類型(關(guān)系數(shù)據(jù)庫、面向?qū)ο髷?shù)據(jù)庫、文件等等)和供應(yīng)商實現(xiàn)不同,持久性存儲(比如數(shù)據(jù)庫)的訪問差別也很大。而且有時候我們的項目需要部署不同的數(shù)據(jù)庫,因此在這些情況下,可以使用Dao模式,
如圖所示,如果考慮為三種不同類型的數(shù)據(jù)庫來實現(xiàn)這個策略,我們可以考慮采用抽象工廠設(shè)計模式.假設(shè).這個工廠創(chuàng)建了CustomerDAO,AccountDAO,OrderDAO的一系列的DAO,該策略運用了在抽象工廠中產(chǎn)生的工廠類中的工廠方法的實現(xiàn).
如下圖所示:
<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),請問這種設(shè)計好嗎,如果使用spring IOC 會出現(xiàn)什么問題,請說明原因。
(2),請重新為該系統(tǒng)進(jìn)行設(shè)計(不用寫代碼),用UML類圖進(jìn)行說明。
(
1
)
AccountManager
和
UserManager
兩個類相互依賴對方,兩個之間相互耦合,實例化一方的時候必須實例化另外一方,會造成循環(huán)依賴,無限依賴,程序運行時會報錯。如果使用
IOC,
則
spring
不知道會先初始化誰而報錯
(
2
)解決辦法:當(dāng)你需要構(gòu)建一個層次結(jié)構(gòu)的子系統(tǒng)時,使用
Facade
模式定義子系統(tǒng)中每層的入口點,如果子系統(tǒng)之間是相互依賴的,你可以讓它們僅通過
Facade
進(jìn)行通訊,從而簡化了它們之間的依賴關(guān)系。
<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,設(shè)計題:關(guān)于某一個系統(tǒng)的權(quán)限管理。業(yè)務(wù)規(guī)則如下</div> <div style="TEXT-AUTOSPACE: ideograph-numeric">(1) ,整個系統(tǒng)(包含多個模塊)有一個管理員,可以管理整個系統(tǒng)的權(quán)限管理;</div> <div style="TEXT-AUTOSPACE: ideograph-numeric">(2) ,每個模塊有自己的管理員,本模塊的管理員只能管理本模塊的權(quán)限。</div> <div style="TEXT-AUTOSPACE: ideograph-numeric">(3) ,某一個管理員是可以同時管理多個部門的。</div> <div style="TEXT-AUTOSPACE: ideograph-numeric">(4) ,管理員不能查看數(shù)據(jù),只能查看文件狀態(tài)。員工可以查看數(shù)據(jù)以及文件的狀態(tài)。</div> <div style="TEXT-AUTOSPACE: ideograph-numeric">(5) ,管理員和管理員之間,管理員和普通員工之間允許相互調(diào)動。</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工具設(shè)計一個簡單的管理系統(tǒng)</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">類記錄管理員和部門之間的管理關(guān)系</span> </div> <div> <span style="COLOR: blue">Authorities</span><span style="COLOR: blue">類定義不同角色所擁有的不同權(quán)限,例如員工可以讀文件,管理員可以看到文件狀態(tài)等。</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工具設(shè)計一個簡單的管理系統(tǒng),可增加、刪除籠子中的寵物,查詢每個籠子中存放的寵物類型,(包括籠子為空的情況),統(tǒng)計籠中寵物的種類和數(shù)量。</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的開發(fā)經(jīng)驗(JSH: jsf + srping + hiberante)</div> <div style="TEXT-AUTOSPACE: ideograph-numeric"> <span> </span>描述自己曾經(jīng)參與過的JSH項目,以及自己在項目中所處的角色,擔(dān)任的主要工作。</div> <div style="TEXT-INDENT: 21pt; TEXT-AUTOSPACE: ideograph-numeric">結(jié)合自己實際參與過的JSH項目,談?wù)勛约簩SH項目的理解。</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