JavaEE面試題收集

零次冪發表於2017-02-17

Java EE平臺構建於Java SE平臺之上,Java EE平臺提供一組API和執行環境來開發和執行大規模的,多層的,可擴充套件的,可靠的和安全的網路應用程式。這裡會不斷收集和更新JavaEE基礎相關的面試題,目前已收集84題。

1.Javascript中常用的事件有哪些?

Onsubmit:提交
Onblur:失去焦點
Onclick:單擊
Onload:載入頁面
Onchange:內容改變
onMouseMove:滑鼠移動
onMouseOver:滑鼠經過
onMouseOut:滑鼠移出
onselect:下拉選項被選中複製程式碼

2.js如何實現頁面重新整理呢?

history.go(0)
location.reload()複製程式碼

3.頁面前進或者後退

前進

history.go(1)
history.forward複製程式碼

後退

History.go(-1)
History.back複製程式碼

4.Js如何跳轉到到一個指定頁面

Location.href=url
History.go(url)

5.使用js獲取一個表單元素

Document.getElementById()
Document.getElementsByName()
Document.getElementsByTagName()複製程式碼

6.如何阻止表單提交

Onsubmit=“return false”

7.正規表示式有那些符號?

$:匹配字串結束的位置
^:匹配字串開始的位置
*:匹配零次或者多次
+:匹配至少一次
?:匹配零次或者一次
.:匹配除換行符 \n之外的任何單字元
{n}:n 是一個非負整數,匹配確定的 n 次 
{n,m}:m 和 n 均為非負整數,表示最多和最少匹配次數,其中n <= m 
\w:匹配單個字元(a-z,0-9,_)
\W:與\w相反
\d:匹配數字
\D:與\d相反複製程式碼

8.Sql中delete與truncate的區別

DELETE:選擇性地刪除資料,當刪除整張表的資料時效率較低;只能刪除整張表的資料,但是效率高於使用DELETE語句;不能選擇性地刪除。當truncate執行刪除之後,自動生成的主鍵值重新從預設值開始。

9.Xml的java解析有幾種方式?

Java API解析xml主要有兩種方式;

Dom解析:一次性載入整個文件,生成樹形結構。在生成的文件物件中,可以對節點進行增刪改查的操作。當xml文字當較小的時候,可以使用dom解析。

Sax解析:基於事件的解析方式,解析速度比較快,解析的文件大小理論上是沒有限制的。

還有一些開源的技術可以解析xml,dom4j或者jdom。

10.Sql優化有那些方法?

表的設計要規範,即要符合資料庫設計三正規化。
適當建立索引,在頻繁作為檢索條件,更新較少的欄位上建立索引,以提高查詢速度。
分表查詢,有水平分割、垂直分割。
讀寫分離,讀(read)、寫(create、update、delete)。
建立儲存過程。複製程式碼

11.Json是什麼?

Json(javascript simple object notation):輕量級的資料交換格式。

12.如何建立一個json物件?

使用{}例項化一個json物件,json物件多個元素使用逗號隔開,每個元素都是一個鍵值對

13.如何解析json物件?

使用json-lib、gson、jackson可以解析json物件。需要將json物件轉換成一個java物件,使用java物件訪問屬性。

14.聚集索引與非聚集索引有什麼區別?

所有的索引都是為了更快地檢索資料,索引存放在索引頁中,資料存放在資料頁中,索引以B(balance)樹的形式儲存

聚集索引:聚集索引用於決定資料表中的物理儲存順序,一張表最多有一個聚集索引。聚集索引的欄位值儘量不能修改,因為修改後,因為修改後資料表的物理順序需要重寫排序。通常主鍵就是聚集索引

非聚集索引:非聚集索引的關鍵自是index,不會決定表的物理儲存順序,在一張表內最多可以有249個非聚集索引。

15.一個類檔案中能否有多個類?有什麼要求?

可以。但是隻能有一個public類,而且public修飾的類名與檔名必須一致

16.你知道有哪些開源框架?

Poi:操作office文件
Jfreechat:生成各種圖表
Ckeditor:論壇中的富文字輸入框
Lucena:用於搜尋技術
Pinyin4j:操作漢字的拼音複製程式碼

17.什麼是事務?事務有那些特點?

事務:

單個邏輯單元執行的一系列操作,要麼全部執行,要麼全部不執行。複製程式碼

特點:

原子性(Atomicity):事務中各元素不可分割,全部執行成功或者撤銷所有的操作
一致性(Consistency):事務完成後資料保持一致的狀
隔離性(Isolation):事務是相對獨立的,對某資料進行修改時,其他事務不變
永續性(Durability):事務完成後對系統的影響是永久性的。複製程式碼

18.事務的使用場景在什麼地方?

但一個業務邏輯包括多個資料庫操作的時候,而且需要保證每個資料表操作都執行的成功進行下一個操作,這個時候可以使用事務

19.Js如何實現動態效果?

操作dom,改變dom的結構

20.Jsp由哪些內容組成?

指令:<%@ %>
指令碼:<% %>
表示式:<%=%>
宣告:<%! %>
註釋:<% -- %>
動作:<jsp:動作名稱 屬性=””>
靜態內容:html內容複製程式碼

21.Jsp包含那些隱藏物件或者內建物件

Page
pageContext
request
response
out
session
application
config
exception複製程式碼

22.如何使用exception物件?

用於處理JSP檔案執行時發生的所有錯誤和異常,只有在page指令中設定isErrorPage值為true的頁面中才可以被使用,在一般的JSP頁面中使用該物件,將無法編譯JSP檔案。

23.Get請求與post有什麼區別?

Get請求傳送的文字內容大小有限制,而post請求沒有限制
Get請求的請求引數會出現在url路徑中,而傳送post請求時,引數不會顯示在url路徑中
Get安全係數較低,但是效率較高。Post安全係數較高,但效率較低
Get請求只能傳送字串,post請求可以提交二進位制資料複製程式碼

24.計算機網路有幾層?

應用層
表示層
會話層
傳輸層
網路層
資料鏈路層
物理層
(物理層是最底層,應用層是最高層)複製程式碼

25.常見的計算機網路協議有那些?

TCP/IP協議
IPX/SPX協議
NetBEUI協議複製程式碼

26.Tcp協議的特點

TCP 是面向連線的傳輸層協議 
每一條 TCP 連線只能有兩個端點(endpoint),每一條 TCP 連線只能是點對點的(一對一) 
TCP 提供可靠交付的服務 
TCP 提供全雙工通訊
面向位元組流複製程式碼

27.Java網路程式設計有幾種?

TCP程式設計
UDP程式設計複製程式碼

28.TCP程式設計與UDP程式設計有什麼區別?

TCP協議:傳輸控制協議,提供可靠無差錯的資料傳輸,效率較低
UDP協議:使用者資料包協議,不可靠的資料傳輸,效率較高複製程式碼

29.建立socket通訊的步驟?

伺服器程式建立一個ServerSocket,然後再用accept方法等待客戶來連線
客戶端程式建立一個Socket並請求與伺服器建立連線
伺服器接收客戶的連線請求,並建立一個新的Socket與該客戶建立專線連線
剛才建立了連線的兩個Socket在一個執行緒上對話
伺服器開始等待新的連線請求複製程式碼

30.Java中如何實現多執行緒

繼承Thread類
實現Runnable介面
推薦使用Runnable介面複製程式碼

31.Java中Synchronized關鍵字的使用?

Synchronized關鍵字在方法簽名上,可以防止多個執行緒同時訪問這個物件的synchronized修飾的方法。如果一個物件有多個synchronized方法,只要一個執行緒訪問其中的一個同步方法,那麼其他執行緒就不能訪問物件其他的任何一個同步方法。不同物件例項的synchronize方法是互不干擾的,也就是說,其他物件還可以訪問這個類中的同步方法。

Synchronized如果修飾的是靜態方法,防止多個執行緒同時訪問這個類中的靜態同步方法,它對類中所有物件都能起作用。也就是說,只有一個物件一個執行緒可以訪問靜態同步方法

Synchronized修飾方法中的某段程式碼塊,只對當前程式碼塊實行互斥訪問。當多個執行緒同步訪問同步程式碼塊,同一時間只能有一個執行緒得到執行,其他執行緒必須等待當前執行緒執行完程式碼塊之後才能執行。當一個執行緒訪問同步程式碼快時,其他執行緒可以訪問非同步的程式碼。當一個執行緒訪問同步程式碼塊時,那麼其他執行緒訪問對其他同步程式碼塊的訪問將會被阻塞

Synchronized關鍵字是不能繼承的,如果父類的synchronized在繼承時並不自動是synchronized修飾的,需要顯示地宣告。

Synchronized修飾this時,會得到這個物件的物件鎖,當一個執行緒訪問時,那麼其他執行緒訪問物件的所有同步程式碼塊或者同步方法,將會被阻塞。

32.什麼是執行緒池?

在一個應用程式中初始化一個執行緒集合,然後在需要執行新的任務時重用執行緒池中的執行緒,而不是建立一個新的執行緒。執行緒池中的每個執行緒都有被分配一個任務,一旦任務完成,執行緒就回到執行緒池中,等待下一次的任務分配

33.什麼是遊標?

遊標是sql查詢結果集的一個指標,與select語句相關聯。

遊標關鍵字是cursor,主要包含兩個部分:遊標結果集和遊標位置。

遊標結果集:執行select語句後的查詢結果
遊標位置:一個指向遊標結果集內某條記錄的指標。複製程式碼

遊標主要有兩個狀態:開啟和關閉。

只有當遊標處於開啟狀態時,才能夠操作結果集中的資料
當遊標關閉後,查詢結果集就不存在了複製程式碼

34.遊標的建立步驟?

定義遊標
開啟遊標
操作遊標資料
關閉遊標複製程式碼

35.在做檔案上傳的時候,form表單的enctype的指是什麼?

Mulitipart/form-data

Html中a標籤的target屬性有哪些值?

_blank:在新的視窗開啟網頁
_self:在本頁面開啟新網頁
_parent:在父frameset框架開啟網頁
_top:去掉所有頁面框架,使用document.htnl替代frameset文件複製程式碼

36.當開啟其他程式的網頁時,使用的target屬性是哪個?

_top

37.Servlet的生命週期?

載入:判斷servlet例項是否存在,如果不存在,就載入serlvet
例項化:
初始化
服務
銷燬複製程式碼

38.Servlet生命週期內呼叫的方法過程?

Init()
Service()
doGet或者doPost
destroy複製程式碼

39.執行緒的生命週期?

新建
就緒
執行
死亡
阻塞複製程式碼

40.Statement與preparedStatement區別

preparedStatement會預編譯sql語句,能夠提高批量的資料操作的執行效率,Statement執行slq的時候才進行編譯

Preparedstatement在第一次執行sql的時候,比較耗費資源。如果只對資料庫進行一次操作,使用statement比較好。

Statement會出現sql注入的問題,使用preparedstatment可以解決sql注入

Session儲存在服務端,cookie儲存在客戶端
Session儲存是物件,cookie只能儲存字串
Session不能設定路徑,cookie可以設定儲存路徑。同一個網站不同網頁的cookie可以儲存到不通的路機構下,彼此是無法相互訪問的。
Session在伺服器關閉後會自動消失,cookie則不會。複製程式碼

42.儲存過程與函式的區別

儲存過程的關鍵自是procedure,函式關鍵字是function
函式必須有返回值,儲存過程沒有返回值,但是有傳出引數
函式注重的是結果,儲存過程注重的是過程
函式可以在select語句中直接使用,而儲存過程則不能複製程式碼

43.會話跟蹤技術有那些?

Session
Cookie
表單隱藏域
url重寫複製程式碼

44.jspservlet中通訊作用域有那些?

PageContext
Request
Session
Application複製程式碼

45.url是什麼?由哪些部分組成?

統一資源定位符
http://localhost:8080/myWeb/index.html:協議+主機地址+埠+專案名稱+資源名稱複製程式碼

46.你所知道的web伺服器有哪些?

Tomcat
Jboss
Weblogic
Glassfish複製程式碼

47.如何部署一個web專案?

可以將web專案打包成.war檔案
把war檔案放在webapps資料夾中複製程式碼

48.如何修改tomcat的埠號?

在tomcat根目錄的conf資料夾內開啟server.xml檔案,修改Connector節點的port屬性

49.重定向和請求轉發的區別?

請求轉發只能將請求轉發給同一個Web應用中的其他資源,而重定向不僅可以定向到當前應用程式中的其他資源,也可以重定向到其他站點上的資源。

重定向結束後,瀏覽器位址列顯示URL會發生改變,由初始的URL地址變成重定向的目標URL。而請求轉發過程結束後,瀏覽器位址列保持初始的URL地址不變。

請求轉發的發起者和接受者之間共享相同的HttpServletRequest例項和HttpServletResponse例項,而重定向的發起者和接受者使用各自的HttpServletRequest例項和HttpServletResponse例項。

轉發是一次請求,重定向是二次請求。轉發是在伺服器進行的,重定向在客服端進行的。

50.上傳檔案是如何做的?

上傳檔案主要用的是開源元件,如apache commoms fileupload或者jspformatupload

51.HTTP的狀態碼

200:請求成功
400:不是正確的請求,大多情況下表示引數錯誤
404:找不到請求資源
500:伺服器內部錯誤
403:伺服器拒絕
405:請求的method不支援
504:伺服器臨時不可用複製程式碼

52.Jsp指令有那些?

Include
Taglib
Page複製程式碼

53.如何使session失效

Session.invalidate()

54.如何在jsp頁面上顯示一些特定格式的數字或者日期

使用jstl標籤庫,使用numberformat或者dateformat標籤

55.什麼是執行緒非同步?什麼是執行緒同步?

執行緒同步:同時只有一條執行緒執行一個任務
執行緒非同步:同時有多條執行緒可以執行執行任務複製程式碼

56.什麼是同步任務?什麼是非同步任務?

同步任務:當前任務沒有完成之前,其他任務不能夠執行
非同步任務:當前任務沒有完成,任然可以可以傳送一個新的請求複製程式碼

57.什麼是過濾器?怎麼建立一個過濾器

過濾器:在請求傳送之後,處理之前對請求的一次攔截,可以更改請求狀態或者引數值等。

建立過濾器:實現filter介面,重寫doFilter方法,最後在web.xml中配置過濾器

58.Int與integer的區別

Integer是int的包裝型別。
Int的預設值是0,integer的預設值是null複製程式碼

59.如何進行單元測試

使用junit

60.使用sql寫出一個分頁程式?

Select top 3 * from tb_name where id not in (select top 3 id from tb_name)

61.監聽器有哪些作用和用法?

ava Web開發中的監聽器(listener)就是application、session、request三個物件建立、銷燬或者往其中新增修改刪除屬性時自動執行程式碼的功能元件,如下所示:

ServletContextListener:對Servlet上下文的建立和銷燬進行監聽。  
ServletContextAttributeListener:監聽Servlet上下文屬性的新增、刪除和替換。  
HttpSessionListener:對Session的建立和銷燬進行監聽。複製程式碼

62.JSP中的靜態包含和動態包含有什麼區別?

靜態包含是通過JSP的include指令包含頁面,動態包含是通過JSP標準動作包含頁面。

靜態包含是編譯時包含,如果包含的頁面不存在則會產生編譯錯誤,而且兩個頁面的"contentType"屬性應保持一致,因為兩個頁面會合二為一,只產生一個class檔案,因此被包含頁面發生的變動再包含它的頁面更新前不會得到更新。

動態包含是執行時包含,可以向被包含的頁面傳遞引數,包含頁面和被包含頁面是獨立的,會編譯出兩個class檔案,如果被包含的頁面不存在,不會產生編譯錯誤,也不影響頁面其他部分的執行。

63.Servlet中如何獲取使用者提交的查詢引數或表單資料?

可以通過請求物件(HttpServletRequest)的getParameter()方法通過引數名獲得引數值。如果有包含多個值的引數(例如核取方塊),可以通過請求物件的getParameterValues()方法獲得。當然也可以通過請求物件的getParameterMap()獲得一個引數名和引數值的對映(Map)。

64.如何設定請求的編碼以及響應內容的型別?

通過請求物件(ServletRequest)的setCharacterEncoding(String)方法可以設定請求的編碼,其實要徹底解決亂碼問題就應該讓頁面、伺服器、請求和響應、Java程式都使用統一的編碼,最好的選擇當然是UTF-8;通過響應物件(ServletResponse)的setContentType(String)方法可以設定響應內容的型別,當然也可以通過HttpServletResponsed物件的setHeader(String, String)方法來設定。

65.什麼是Web Service(Web服務)

從表面上看,Web Service就是一個應用程式,它向外界暴露出一個能夠通過Web進行呼叫的API。這就是說,你能夠用程式設計的方法透明的呼叫這個應用程式,不需要了解它的任何細節,跟你使用的程式語言也沒有關係。例如可以建立一個提供天氣預報的Web Service,那麼無論你用哪種程式語言開發的應用都可以通過呼叫它的API並傳入城市資訊來獲得該城市的天氣預報。之所以稱之為Web Service,是因為它基於HTTP協議傳輸資料,這使得執行在不同機器上的不同應用無須藉助附加的、專門的第三方軟體或硬體,就可相互交換資料或整合。

66.什麼是ORM?

物件關係對映(Object-Relational Mapping,簡稱ORM)是一種為了解決程式的物件導向模型與資料庫的關係模型互不匹配問題的技術

67.Hibernate中SessionFactory是執行緒安全的嗎?Session是執行緒安全的嗎(兩個執行緒能夠共享同一個Session嗎)?

SessionFactory對應Hibernate的一個資料儲存的概念,它是執行緒安全的,可以被多個執行緒併發訪問。SessionFactory一般只會在啟動的時候構建。對於應用程式,最好將SessionFactory通過單例模式進行封裝以便於訪問。Session是一個輕量級非執行緒安全的物件(執行緒間不能共享session),它表示與資料庫進行互動的一個工作單元。Session是由SessionFactory建立的,在任務完成之後它會被關閉。Session是持久層服務對外提供的主要介面。Session會延遲獲取資料庫連線(也就是在需要的時候才會獲取)。為了避免建立太多的session,可以使用ThreadLocal將session和當前執行緒繫結在一起,這樣可以讓同一個執行緒獲得的總是同一個session。Hibernate 3中SessionFactory的getCurrentSession()方法就可以做到。

68.Hibernate中Session的load和get方法的區別是什麼?

如果沒有找到符合條件的記錄,get方法返回null,load方法丟擲異常。

get方法直接返回實體類物件,load方法返回實體類物件的代理。

在Hibernate 3之前,get方法只在一級快取中進行資料查詢,如果沒有找到對應的資料則越過二級快取,直接發出SQL語句完成資料讀取;load方法則可以從二級快取中獲取資料;從Hibernate 3開始,get方法不再是對二級快取只寫不讀,它也是可以訪問二級快取的。

69.Hibernate的物件有幾種狀態

瞬時態(transient)
持久態(persistent)
遊離態(detached)複製程式碼

70.Session的save()、update()、merge()、lock()、saveOrUpdate()和persist()方法分別是做什麼的?有什麼區別?

瞬時態的例項可以通過呼叫save()、persist()或者saveOrUpdate()方法變成持久態;遊離態的例項可以通過呼叫 update()、saveOrUpdate()、lock()或者replicate()變成持久態。save()和persist()將會引發SQL的INSERT語句,而update()或merge()會引發UPDATE語句。save()和update()的區別在於一個是將瞬時態物件變成持久態,一個是將遊離態物件變為持久態。merge()方法可以完成save()和update()方法的功能,它的意圖是將新的狀態合併到已有的持久化物件上或建立新的持久化物件。

對於persist()方法,

persist()方法把一個瞬時態的例項持久化,但是並不保證識別符號被立刻填入到持久化例項中,識別符號的填入可能被推遲到flush的時間;

persist()方法保證當它在一個事務外部被呼叫的時候並不觸發一個INSERT語句,當需要封裝一個長會話流程的時候,persist()方法是很有必要的;

save()方法不保證第②條,它要返回識別符號,所以它會立即執行INSERT語句,不管是在事務內部還是外部。至於lock()方法和update()方法的區別,update()方法是把一個已經更改過的脫管狀態的物件變成持久狀態;lock()方法是把一個沒有更改過的脫管狀態的物件變成持久狀態。

71.Session載入實體物件的過程。

Session在呼叫資料庫查詢功能之前,首先會在一級快取中通過實體型別和主鍵進行查詢,如果一級快取查詢命中且資料狀態合法,則直接返回;

如果一級快取沒有命中,接下來Session會在當前NonExists記錄(相當於一個查詢黑名單,如果出現重複的無效查詢可以迅速做出判斷,從而提升效能)中進行查詢,如果NonExists中存在同樣的查詢條件,則返回null;

如果一級快取查詢失敗則查詢二級快取,如果二級快取命中則直接返回;

如果之前的查詢都未命中,則發出SQL語句,如果查詢未發現對應記錄則將此次查詢新增到Session的NonExists中加以記錄,並返回null;

根據對映配置和SQL語句得到ResultSet,並建立對應的實體物件;

將物件納入Session(一級快取)的管理;

如果有對應的攔截器,則執行攔截器的onLoad方法;

如果開啟並設定了要使用二級快取,則將資料物件納入二級快取;

返回資料物件。

72.Query介面的list方法和iterate方法有什麼區別?

list()方法無法利用一級快取和二級快取(對快取只寫不讀),它只能在開啟查詢快取的前提下使用查詢快取;iterate()方法可以充分利用快取,如果目標資料只讀或者讀取頻繁,使用iterate()方法可以減少效能開銷。

list()方法不會引起N+1查詢問題,而iterate()方法可能引起N+1查詢問題

73.如何理解Hibernate的延遲載入機制?在實際應用中,延遲載入與Session關閉的矛盾是如何處理的?

延遲載入就是並不是在讀取的時候就把資料載入進來,而是等到使用時再載入。Hibernate使用了虛擬代理機制實現延遲載入,我們使用Session的load()方法載入資料或者一對多關聯對映在使用延遲載入的情況下從一的一方載入多的一方,得到的都是虛擬代理,簡單的說返回給使用者的並不是實體本身,而是實體物件的代理。代理物件在使用者呼叫getter方法時才會去資料庫載入資料。但載入資料就需要資料庫連線。而當我們把會話關閉時,資料庫連線就同時關閉了。

延遲載入與session關閉的矛盾一般可以這樣處理:

關閉延遲載入特性。這種方式操作起來比較簡單,因為Hibernate的延遲載入特性是可以通過對映檔案或者註解進行配置的,但這種解決方案存在明顯的缺陷。首先,出現"no session or session was closed"通常說明系統中已經存在主外來鍵關聯,如果去掉延遲載入的話,每次查詢的開銷都會變得很大。

在session關閉之前先獲取需要查詢的資料,可以使用工具方法Hibernate.isInitialized()判斷物件是否被載入,如果沒有被載入則可以使用Hibernate.initialize()方法載入物件。

使用攔截器或過濾器延長Session的生命週期直到檢視獲得資料。Spring整合Hibernate提供的OpenSessionInViewFilter和OpenSessionInViewInterceptor就是這種做法。

74.簡述Hibernate常見優化策略。

制定合理的快取策略(二級快取、查詢快取)。
採用合理的Session管理機制。
儘量使用延遲載入特性。
設定合理的批處理引數。
如果可以,選用UUID作為主鍵生成器。
如果可以,選用樂觀鎖替代悲觀鎖。
在開發過程中, 開啟hibernate.show_sql選項檢視生成的SQL,從而瞭解底層的狀況;開發完成後關閉此選項。
考慮資料庫本身的優化,合理的索引、恰當的資料分割槽策略等都會對持久層的效能帶來可觀的提升,但這些需要專業的DBA(資料庫管理員)提供支援。複製程式碼

75.談一談Hibernate的一級快取、二級快取和查詢快取。

Hibernate的Session提供了一級快取的功能,預設總是有效的,當應用程式儲存持久化實體、修改持久化實體時,Session並不會立即把這種改變提交到資料庫,而是快取在當前的Session中,除非顯示呼叫了Session的flush()方法或通過close()方法關閉Session。通過一級快取,可以減少程式與資料庫的互動,從而提高資料庫訪問效能。

SessionFactory級別的二級快取是全域性性的,所有的Session可以共享這個二級快取。不過二級快取預設是關閉的,需要顯示開啟並指定需要使用哪種二級快取實現類(可以使用第三方提供的實現)。一旦開啟了二級快取並設定了需要使用二級快取的實體類,SessionFactory就會快取訪問過的該實體類的每個物件,除非快取的資料超出了指定的快取空間。

一級快取和二級快取都是對整個實體進行快取,不會快取普通屬性,如果希望對普通屬性進行快取,可以使用查詢快取。查詢快取是將HQL或SQL語句以及它們的查詢結果作為鍵值對進行快取,對於同樣的查詢可以直接從快取中獲取資料。查詢快取預設也是關閉的,需要顯示開啟。

76.MyBatis中使用#和$書寫佔位符有什麼區別?

#將傳入的資料都當成一個字串,會對傳入的資料自動加上引號;$將傳入的資料直接顯示生成在SQL中。注意:使用$佔位符可能會導致SQL注射攻擊,能用#的地方就不要使用$,寫order by子句的時候應該用$而不是#。、

77.什麼是IoC和DI?DI是如何實現的?

IoC叫控制反轉,是Inversion of Control的縮寫,DI(Dependency Injection)叫依賴注入,是對IoC更簡單的詮釋。控制反轉是把傳統上由程式程式碼直接操控的物件的呼叫權交給容器,通過容器來實現物件元件的裝配和管理。所謂的"控制反轉"就是對元件物件控制權的轉移,從程式程式碼本身轉移到了外部容器,由容器來建立物件並管理物件之間的依賴關係。依賴注入的基本原則是應用元件不應該負責查詢資源或者其他依賴的協作物件。配置物件的工作應該由容器負責,查詢資源的邏輯應該從應用元件的程式碼中抽取出來,交給容器來完成。DI是對IoC更準確的描述,即元件之間的依賴關係由容器在執行期決定,形象的來說,即由容器動態的將某種依賴關係注入到元件之中。

依賴注入可以通過setter方法注入(設值注入)、構造器注入和介面注入三種方式來實現,Spring支援setter注入和構造器注入,通常使用構造器注入來注入必須的依賴關係,對於可選的依賴關係,則setter注入是更好的選擇,setter注入需要類提供無參構造器或者無參的靜態工廠方法來建立物件。

78.Spring中自動裝配的方式有哪些?

no:不進行自動裝配,手動設定Bean的依賴關係。  
byName:根據Bean的名字進行自動裝配。
byType:根據Bean的型別進行自動裝配。
constructor:類似於byType,不過是應用於構造器的引數,如果正好有一個Bean與構造器的引數型別相同則可以自動裝配,否則會導致錯誤。
autodetect:如果有預設的構造器,則通過constructor的方式進行自動裝配,否則使用byType的方式進行自動裝配。複製程式碼

79.解釋一下什麼叫AOP(面向切面程式設計)?

AOP(Aspect-Oriented Programming)指一種程式設計範型,該範型以一種稱為切面(aspect)的語言構造為基礎,切面是一種新的模組化機制,用來描述分散在物件、類或方法中的橫切關注點(crosscutting concern)。

80.Spring中Bean的作用域有哪些?

Singleton:Bean以單例的方式存在
Prototype:表示每次從容器中呼叫Bean時,都會返回一個新的例項,prototype通常翻譯為原型
Request:每次HTTP請求都會建立一個新的Bean
Session:同一個HttpSession共享同一個Bean,不同的HttpSession使用不同的Bean
globalSession:同一個全域性Session共享一個Bean複製程式碼

81.Spring中如何使用註解來配置Bean?有哪些相關的註解?

首先需要在Spring配置檔案中增加配置:

用@Component、@Controller、@Service、@Repository註解來標註需要由Spring IoC容器進行物件託管的類。

@Controller通常用於控制器
@Service通常用於業務邏輯類
@Repository通常用於DAO類
普通的類用@Component來標註。複製程式碼

82.Spring支援的事務管理型別有哪些?你在專案中使用哪種方式?

Spring支援程式設計式事務管理和宣告式事務管理。宣告式事務管理要優於程式設計式事務管理,儘管在靈活性方面它弱於程式設計式事務管理,因為程式設計式事務允許通過程式碼控制業務。

83.Spring MVC的工作原理是怎樣的?

客戶端的所有請求都交給前端控制器DispatcherServlet來處理,它會負責呼叫系統的其他模組來真正處理使用者的請求。

DispatcherServlet收到請求後,將根據請求的資訊(包括URL、HTTP協議方法、請求頭、請求引數、Cookie等)以及HandlerMapping的配置找到處理該請求的Handler(任何一個物件都可以作為請求的Handler)。

在這個地方Spring會通過HandlerAdapter對該處理器進行封裝。

HandlerAdapter是一個介面卡,它用統一的介面對各種Handler中的方法進行呼叫。

Handler完成對使用者請求的處理後,會返回一個ModelAndView物件給DispatcherServlet,ModelAndView顧名思義,包含了資料模型以及相應的檢視的資訊。

ModelAndView的檢視是邏輯檢視,DispatcherServlet還要藉助ViewResolver完成從邏輯檢視到真實檢視物件的解析工作。

當得到真正的檢視物件後,DispatcherServlet會利用檢視物件對模型資料進行渲染。

客戶端得到響應,可能是一個普通的HTML頁面,也可以是XML或JSON字串,還可以是一張圖片或者一個PDF檔案。

84.闡述Spring框架中Bean的生命週期?

Spring IoC容器找到關於Bean的定義並例項化該Bean。  
pring IoC容器對Bean進行依賴注入。
如果Bean實現了BeanNameAware介面,則將該Bean的id傳給setBeanName方法。
如果Bean實現了BeanFactoryAware介面,則將BeanFactory物件傳給setBeanFactory方法。
如果Bean實現了BeanPostProcessor介面,則呼叫其postProcessBeforeInitialization方法。
如果Bean實現了InitializingBean介面,則呼叫其afterPropertySet方法。
如果有和Bean關聯的BeanPostProcessors物件,則這些物件的postProcessAfterInitialization方法被呼叫。
當銷燬Bean例項時,如果Bean實現了DisposableBean介面,則呼叫其destroy方法。複製程式碼

相關文章