1. 程式人生 > >【整理】SpringMvc+Spring+Hibernate面試題

【整理】SpringMvc+Spring+Hibernate面試題

SpringMVC部分

1、什麼是Spring MVC ?簡單介紹下你對springMVC的理解?

Spring MVC是一個基於MVC架構的用來簡化web應用程式開發的應用開發框架,它是Spring的一個模組,無需中間整合層來整合 ,它和Struts2一樣都屬於表現層的框架。在web模型中,MVC是一種很流行的框架,通過把Model,View,Controller分離,把較為複雜的web應用分成邏輯清晰的幾部分,簡化開發,減少出錯,方便組內開發人員之間的配合。

 2、SpringMVC的流程?(重點)

(1)使用者傳送請求至前端控制器DispatcherServlet;
(2) DispatcherServlet收到請求後,呼叫HandlerMapping處理器對映器,請求獲取Handle;
(3)處理器對映器根據請求url找到具體的處理器,生成處理器物件及處理器攔截器(如果有則生成)一併返回給DispatcherServlet;
(4)DispatcherServlet通過HandlerAdapter處理器介面卡呼叫處理器;
(5)執行處理器(Handler,也叫後端控制器);
(6)Handler執行完成返回ModelAndView;
(7)HandlerAdapter將Handler執行結果ModelAndView返回給DispatcherServlet;
(8)DispatcherServlet將ModelAndView傳給ViewResolver檢視解析器進行解析;
(9)ViewResolver解析後返回具體View;
(10)DispatcherServlet對View進行渲染檢視(即將模型資料填充至檢視中)
(11)DispatcherServlet響應使用者。

3、Springmvc的優點

(1)它是基於元件技術的。全部的應用物件,無論控制器和檢視,還是業務物件之類的都是 java元件.並且和Spring提供的其他基礎結構緊密整合.

(2)不依賴於Servlet API(目標雖是如此,但是在實現的時候確實是依賴於Servlet的)

(3)可以任意使用各種檢視技術,而不僅僅侷限於JSP

(4) 支援各種請求資源的對映策略

(5)它應是易於擴充套件的

4、SpringMVC怎麼樣設定重定向和轉發的? 

(1)在返回值前面加"forward:"就可以讓結果轉發,譬如"forward:user?name=method4"

(2)在返回值前面加"redirect:"就可以讓返回值重定向,譬如"redirect:http://www.baidu.com"

5、如何解決POST請求中文亂碼問題,GET的又如何處理呢? 

(1)解決post請求亂碼問題:

在web.xml中加入:

<filter>

    <filter-name>CharacterEncodingFilter</filter-name>

    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>

    <init-param>

        <param-name>encoding</param-name>

        <param-value>utf-8</param-value>

    </init-param>

</filter>

<filter-mapping>

    <filter-name>CharacterEncodingFilter</filter-name>

    <url-pattern>/*</url-pattern>

</filter-mapping>

(2)get請求中文引數出現亂碼解決方法有兩個:

①修改tomcat配置檔案新增編碼與工程編碼一致,如下:

<ConnectorURIEncoding="utf-8" connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>

 ②另外一種方法對引數進行重新編碼:

String userName = new String(request.getParamter("userName").getBytes("ISO8859-1"),"utf-8")

ISO8859-1是tomcat預設編碼,需要將tomcat編碼後的內容按utf-8編碼。

6、SpringMvc的控制器是不是單例模式,如果是,有什麼問題,怎麼解決? 

是單例模式,所以在多執行緒訪問的時候有執行緒安全問題,不要用同步,會影響效能的,解決方案是在控制器裡面不能寫欄位。 

7、SpingMvc中的控制器的註解一般用那個,有沒有別的註解可以替代?

一般用@Conntroller註解,表示是表現層,不能用用別的註解代替。

8、 @RequestMapping註解用在類上面有什麼作用?

是一個用來處理請求地址對映的註解,可用於類或方法上。用於類上,表示類中的所有響應請求的方法都是以該地址作為父路徑。

9、如果在攔截請求中,我想攔截get方式提交的方法,怎麼配置?

可以在@RequestMapping註解裡面加上method=RequestMethod.GET。

10、怎麼樣在方法裡面得到Request,或者Session? 

直接在方法的形參中宣告request,SpringMvc就自動把request物件傳入。

11、談談你mvc的理解 

MVC是Model—View—Controler的簡稱。即模型—檢視—控制器。MVC是一種設計模式,它強制性的把應用程式的輸入、處理和輸出分開。

    MVC中的模型、檢視、控制器它們分別擔負著不同的任務。

    檢視: 檢視是使用者看到並與之互動的介面。檢視向用戶顯示相關的資料,並接受使用者的輸入。檢視不進行任何業務邏輯處理。

    模型: 模型表示業務資料和業務處理。相當於JavaBean。一個模型能為多個檢視提供資料。這提高了應用程式的重用性

    控制器: 當用戶單擊Web頁面中的提交按鈕時,控制器接受請求並呼叫相應的模型去處理請求。

            然後根據處理的結果呼叫相應的檢視來顯示處理的結果。

    MVC的處理過程:首先控制器接受使用者的請求,呼叫相應的模型來進行業務處理,並返回資料給控制器。控制器呼叫相應的檢視來顯示處理的結果。並通過檢視呈現給使用者。

--------------------------------------------------------------------------------------------------------------------------

Hibernate部分

1、 Hibernate工作原理及為什麼要用?(重)

  1. 讀取並解析配置檔案
  2. 讀取並解析對映資訊,建立SessionFactory
  3. 開啟Sesssion
  4. 建立事務Transation
  5. 持久化操作
  6. 提交事務
  7. 關閉Session
  8. 關閉SesstionFactory

為什麼要用: 
1. 對JDBC訪問資料庫的程式碼做了封裝,大大簡化了資料訪問層繁瑣的重複性程式碼。

2. Hibernate是一個基於JDBC的主流持久化框架,是一個優秀的ORM實現。他很大程度的簡化DAO層的編碼工作

3. hibernate使用Java反射機制,而不是位元組碼增強程式來實現透明性。

4. hibernate的效能非常好,因為它是個輕量級框架。對映的靈活性很出色。它支援各種關係資料庫,從一對一到多對多的各種複雜關係。

 2、什麼是Hibernate的併發機制?怎麼去處理併發問題?

Hibernate併發機制:

a、Hibernate的Session物件是非執行緒安全的,對於單個請求,單個會話,單個的工作單元(即單個事務,單個執行緒),它通常只使用一次, 然後就丟棄。

如果一個Session 例項允許共享的話,那些支援併發執行的,例如Http request,session beans將會導致出現資源爭用。 

如果在Http Session中有hibernate的Session的話,就可能會出現同步訪問Http Session。只要使用者足夠快的點選瀏覽器的“重新整理”,  就會導致兩個併發執行的執行緒使用同一個Session。  

b、多個事務併發訪問同一塊資源,可能會引發第一類丟失更新,髒讀,幻讀,不可重複讀,第二類丟失更新一系列的問題。

解決方案:設定事務隔離級別。 
Serializable:序列化。隔離級別最高 
Repeatable Read:可重複讀 
Read Committed:已提交資料讀 
Read Uncommitted:未提交資料讀。隔離級別最差 
設定鎖:樂觀鎖和悲觀鎖。 
樂觀鎖:使用版本號或時間戳來檢測更新丟失,在的對映中設定 optimistic-lock=”all”可以在沒有版本或者時間戳屬性對映的情況下實現 版本檢查,此時Hibernate將比較一行記錄的每個欄位的狀態 行級悲觀鎖:Hibernate總是使用資料庫的鎖定機制,從不在記憶體中鎖定物件!只要為JDBC連線指定一下隔 離級別,然後讓資料庫去搞定一切就夠了。類LockMode 定義了Hibernate所需的不同的鎖定級別:LockMode.UPGRADE,LockMode.UPGRADE_NOWAIT,LockMode.READ;

3、update和saveOrUpdate的區別? 

update()和saveOrUpdate()是用來對跨Session的PO進行狀態管理的。 
update()方法操作的物件必須是持久化了的物件。也就是說,如果此物件在資料庫中不存在的話,就不能使用update()方法。 
saveOrUpdate()方法操作的物件既可以使持久化了的,也可以使沒有持久化的物件。如果是持久化了的物件呼叫saveOrUpdate()則會 更新資料庫中的物件;如果是未持久化的物件使用此方法,則save到資料庫中。

4、hibernate的三種狀態之間如何轉換 

    當物件由瞬時狀態(Transient)一save()時,就變成了持久化狀態。

    當我們在Session裡儲存物件的時候,實際是在Session的Map裡存了一份,

    也就是它的快取裡放了一份,然後,又到資料庫裡存了一份,在快取裡這一份叫持久物件(Persistent)。

    Session 一 Close()了,它的快取也都關閉了,整個Session也就失效了,

    這個時候,這個物件變成了遊離狀態(Detached),但資料庫中還是存在的。

    當遊離狀態(Detached)update()時,又變為了持久狀態(Persistent)。

    當持久狀態(Persistent)delete()時,又變為了瞬時狀態(Transient),

    此時,資料庫中沒有與之對應的記錄。

5、什麼是SessionFactory,它是執行緒安全麼?

SessionFactory 是Hibrenate單例資料儲存和執行緒安全的,以至於可以多執行緒同時訪問。一個SessionFactory 在啟動的時候只能建立一次。SessionFactory應該包裝各種單例以至於它能很簡單的在一個應用程式碼中儲存.

6、Hibernate的五個核心介面 

Configuration 介面:配置Hibernate,根據其啟動hibernate,建立 
SessionFactory 物件; 
SessionFactory 介面:初始化Hibernate,充當資料儲存源的代理,建立 
session 物件,sessionFactory 是執行緒安全的,意味著它的同一個例項可以被應 
用的多個執行緒共享,是重量級、二級快取; 
Session 介面:負責儲存、更新、刪除、載入和查詢物件,是執行緒不安全的, 
避免多個執行緒共享同一個session,是輕量級、一級快取; 
Transaction 介面:管理事務; 
Query 和Criteria 介面:執行資料庫的查詢。

7、 hibernate如何管理快取

Hibernate 中提供了兩級Cache,第一級別的快取是Session級別的快取,它是屬於事務範圍的快取。這一級別的快取由hibernate管理的,一般情況下無需進行干預;第二級別的快取是SessionFactory級別的快取,它是屬於程序範圍或群集範圍的快取。這一級別的快取可以進行配置和更改,並且可以動態載入和解除安裝。 Hibernate還為查詢結果提供了一個查詢快取,它依賴於第二級快取。

  1. 一級快取和二級快取的比較:第一級快取 第二級快取 存放資料的形式 相互關聯的持久化物件 物件的散裝資料 快取的範圍 事務範圍,每個事務都有單獨的第一級快取程序範圍或叢集範圍,快取被同一個程序或叢集範圍內的所有事務共享 併發訪問策略由於每個事務都擁有單獨的第一級快取,不會出現併發問題,無需提供併發訪問策略由於多個事務會同時訪問第二級快取中相同資料,因此必須提供適當的併發訪問策略,來保證特定的事務隔離級別 資料過期策略沒有提供資料過期策略。處於一級快取中的物件永遠不會過期,除非應用程式顯式清空快取或者清除特定的物件必須提供資料過期策略,如基於記憶體的快取中的物件的最大數目,允許物件處於快取中的最長時間,以及允許物件處於快取中的最長空閒時間 物理儲存介質記憶體記憶體和硬碟。物件的散裝資料首先存放在基於內在的快取中,當記憶體中物件的數目達到資料過期策略中指定上限時,就會把其餘的物件寫入基於硬碟的快取中。快取的軟體實現 在Hibernate的Session的實現中包含了快取的實現由第三方提供,Hibernate僅提供了快取介面卡(CacheProvider)。用於把特定的快取外掛整合到Hibernate中。啟用快取的方式只要應用程式通過Session介面來執行儲存、更新、刪除、載入和查詢資料庫資料的操作,Hibernate就會啟用第一級快取,把資料庫中的資料以物件的形式拷貝到快取中,對於批量更新和批量刪除操作,如果不希望啟用第一級快取,可以繞過Hibernate API,直接通過JDBC API來執行指操作。使用者可以在單個類或類的單個集合的粒度上配置第二級快取。如果類的例項被經常讀但很少被修改,就可以考慮使用第二級快取。只有為某個類或集合配置了第二級快取,Hibernate在執行時才會把它的例項加入到第二級快取中。 使用者管理快取的方式第一級快取的物理介質為記憶體,由於記憶體容量有限,必須通過恰當的檢索策略和檢索方式來限制載入物件的數目。Session的evit()方法可以顯式清空快取中特定物件,但這種方法不值得推薦。 第二級快取的物理介質可以是記憶體和硬碟,因此第二級快取可以存放大量的資料,資料過期策略的maxElementsInMemory屬性值可以控制記憶體中的物件數目。管理第二級快取主要包括兩個方面:選擇需要使用第二級快取的持久類,設定合適的併發訪問策略:選擇快取介面卡,設定合適的資料過期策略。

  2. 一級快取的管理: 當應用程式呼叫Session的save()、update()、savaeOrUpdate()、get()或load(),以及呼叫查詢介面的 list()、iterate()或filter()方法時,如果在Session快取中還不存在相應的物件,Hibernate就會把該物件加入到第一級快取中。當清理快取時,Hibernate會根據快取中物件的狀態變化來同步更新資料庫。 Session為應用程式提供了兩個管理快取的方法: evict(Object obj):從快取中清除引數指定的持久化物件。 clear():清空快取中所有持久化物件。

  3. 二級快取的管理:

  3.1. Hibernate的二級快取策略的一般過程如下:

  1) 條件查詢的時候,總是發出一條select * from table_name where …. (選擇所有欄位)這樣的SQL語句查詢資料庫,一次獲得所有的資料物件。

  2) 把獲得的所有資料物件根據ID放入到第二級快取中。

  3) 當Hibernate根據ID訪問資料物件的時候,首先從Session一級快取中查;查不到,如果配置了二級快取,那麼從二級快取中查;查不到,再查詢資料庫,把結果按照ID放入到快取。

  4) 刪除、更新、增加資料的時候,同時更新快取。

  Hibernate的二級快取策略,是針對於ID查詢的快取策略,對於條件查詢則毫無作用。為此,Hibernate提供了針對條件查詢的Query Cache。

  3.2. 什麼樣的資料適合存放到第二級快取中? 1 很少被修改的資料 2 不是很重要的資料,允許出現偶爾併發的資料 3 不會被併發訪問的資料 4 參考資料,指的是供應用參考的常量資料,它的例項數目有限,它的例項會被許多其他類的例項引用,例項極少或者從來不會被修改。

  3.3. 不適合存放到第二級快取的資料? 1 經常被修改的資料 2 財務資料,絕對不允許出現併發 3 與其他應用共享的資料。

  3.4. 常用的快取外掛 Hibernater 的二級快取是一個外掛,下面是幾種常用的快取外掛:

  EhCache:可作為程序範圍的快取,存放資料的物理介質可以是記憶體或硬碟,對Hibernate的查詢快取提供了支援。

  OSCache:可作為程序範圍的快取,存放資料的物理介質可以是記憶體或硬碟,提供了豐富的快取資料過期策略,對Hibernate的查詢快取提供了支援。

  SwarmCache:可作為群集範圍內的快取,但不支援Hibernate的查詢快取。

  JBossCache:可作為群集範圍內的快取,支援事務型併發訪問策略,對Hibernate的查詢快取提供了支援。

  3.5. 配置二級快取的主要步驟:

  1) 選擇需要使用二級快取的持久化類,設定它的命名快取的併發訪問策略。這是最值得認真考慮的步驟。

  2) 選擇合適的快取外掛,然後編輯該外掛的配置檔案。

 8、 Hibernate 的檢索方式有哪些 ?

① 導航物件圖檢索 
② OID檢索 
③ HQL檢索 
④ QBC檢索 
⑤ 本地SQL檢索

9、load()和get()的區別  

①:如果資料庫中,沒有 OID 指定的物件。通過 get方法載入,則返回的是一個null;通過load載入,則返回一個代理物件,如果後面程式碼如果呼叫物件的某個屬性會丟擲異常:org.hibernate.ObjectNotFoundException;
②:load 支援延遲載入,get不支援延遲載入。

10、什麼是懶載入?他的作用? 

延遲載入,也叫懶載入,它是hibernate為提高程式執行效率而提供的一種機制,即只有真正使用該物件的資料時才會建立。

Hibernate中主要是通過代理(proxy)機制來實現延遲載入。它的具體過程:Hibernate從資料庫獲取某一個物件資料時、獲取某一個物件的集合屬性值時,或獲取某一個物件所關聯的另一個物件時,由於沒有使用該物件的資料,hibernate並不是資料庫載入真正的資料,而只是為該物件建立一個代理物件來代表這個物件,這個物件上的所有屬性都是預設值;只有在真正需要使用該物件的資料時才建立這個真實物件,真正從資料庫中載入它的資料,這樣在某些情況下,就可以提高查詢效率。

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------

Spring部分 

1、Spring是什麼?根據你的理解詳細談談你的見解。

◆目的:解決企業應用開發的複雜性

  ◆功能:使用基本的JavaBean代替EJB,並提供了更多的企業應用功能

  ◆範圍:任何Java應用

  簡單來說,Spring是一個輕量級的控制反轉(IoC)和麵向切面(AOP)的容器框架。

  ◆輕量——從大小與開銷兩方面而言Spring都是輕量的。完整的Spring框架可以在一個大小隻有1MB多的JAR檔案裡釋出。並且Spring所需的處理開銷也是微不足道的。此外,Spring是非侵入式的:典型地,Spring應用中的物件不依賴於Spring的特定類。

  ◆控制反轉——Spring通過一種稱作控制反轉(IoC)的技術促進了鬆耦合。當應用了IoC,一個物件依賴的其它物件會通過被動的方式傳遞進來,而不是這個物件自己建立或者查詢依賴物件。你可以認為IoC與JNDI相反——不是物件從容器中查詢依賴,而是容器在物件初始化時不等物件請求就主動將依賴傳遞給它。

  ◆面向切面——Spring提供了面向切面程式設計的豐富支援,允許通過分離應用的業務邏輯與系統級服務(例如審計(auditing)和事務()管理)進行內聚性的開發。應用物件只實現它們應該做的——完成業務邏輯——僅此而已。它們並不負責(甚至是意識)其它的系統級關注點,例如日誌或事務支援。

  ◆容器——Spring包含並管理應用物件的配置和生命週期,在這個意義上它是一種容器,你可以配置你的每個bean如何被建立——基於一個可配置原型(prototype),你的bean可以建立一個單獨的例項或者每次需要時都生成一個新的例項——以及它們是如何相互關聯的。然而,Spring不應該被混同於傳統的重量級的EJB容器,它們經常是龐大與笨重的,難以使用。

  ◆框架——Spring可以將簡單的元件配置、組合成為複雜的應用。在Spring中,應用物件被宣告式地組合,典型地是在一個XML檔案裡。Spring也提供了很多基礎功能(事務管理、持久化框架整合等等),將應用邏輯的開發留給了你。

  所有Spring的這些特徵使你能夠編寫更乾淨、更可管理、並且更易於測試的程式碼。它們也為Spring中的各種模組提供了基礎支援。

2、 使用Spring的好處 

AOP 讓開發人員可以建立非行為性的關注點,稱為橫切關注點,並將它們插入到應用程式程式碼中。使用 AOP 後,公共服務 (比 如日誌、永續性、事務等)就可以分解成方面並應用到域物件上,同時不會增加域物件的物件模型的複雜性。

IOC 允許建立一個可以構造物件的應用環境,然後向這些物件傳遞它們的協作物件。正如單詞 倒置 所表明的,IOC 就像反 過來的 JNDI。沒有使用一堆抽象工廠、服務定位器、單元素(singleton)和直接構造(straight construction),每一個物件都是用其協作物件構造的。因此是由容器管理協作物件(collaborator)。

Spring即使一個AOP框架,也是一IOC容器。 Spring 最好的地方是它有助於您替換物件。有了 Spring,只要用 JavaBean 屬性和配置檔案加入依賴性(協作物件)。然後可以很容易地在需要時替換具有類似介面的協作物件。

3、Spring的優點?

1.降低了元件之間的耦合性 ,實現了軟體各層之間的解耦 
2.可以使用容易提供的眾多服務,如事務管理,訊息服務等 
3.容器提供單例模式支援 
4.容器提供了AOP技術,利用它很容易實現如許可權攔截,執行期監控等功能 
5.容器提供了眾多的輔助類,能加快應用的開發 
6.spring對於主流的應用框架提供了整合支援,如hibernate,JPA,Struts等 
7.spring屬於低侵入式設計,程式碼的汙染極低 
8.獨立於各種應用伺服器 
9.spring的DI機制降低了業務物件替換的複雜性 
10.Spring的高度開放性,並不強制應用完全依賴於Spring,開發者可以自由選擇spring 的部分或全部 

4、Spring管理事務有幾種方式?

有兩種方式:

1、程式設計式事務,在程式碼中硬編碼。(不推薦使用)

2、宣告式事務,在配置檔案中配置(推薦使用)

宣告式事務又分為兩種:

a、基於XML的宣告式事務

b、基於註解的宣告式事務

5、spring中自動裝配的方式有哪些?

1、 No:即不啟用自動裝配。

2、 byName:通過屬性的名字的方式查詢JavaBean依賴的物件併為其注入。比如說類Computer有個屬性printer,指定其autowire屬性為byName後,Spring IoC容器會在配置檔案中查詢id/name屬性為printer的bean,然後使用Seter方法為其注入。

3、 byType:通過屬性的型別查詢JavaBean依賴的物件併為其注入。比如類Computer有個屬性printer,型別為Printer,那麼,指定其autowire屬性為byType後,Spring IoC容器會查詢Class屬性為Printer的bean,使用Seter方法為其注入。

4、 constructor:通byType一樣,也是通過型別查詢依賴物件。與byType的區別在於它不是使用Seter方法注入,而是使用構造子注入。

5、 autodetect:在byType和constructor之間自動的選擇注入方式。

6、 default:由上級標籤<beans>的default-autowire屬性確定。

6.什麼是IOC,什麼又是DI,他們有什麼區別?

依賴注入DI是一個程式設計模式和架構模型, 一些時候也稱作控制反轉,儘管在技術上來講,依賴注入是一個IOC的特殊實現,依賴注入是指一個物件應用另外一個物件來提供一個特殊的能力,例如:把一個 資料庫連線已引數的形式傳到一個物件的結構方法裡面而不是在那個物件內部自行建立一個連線。控制反轉和依賴注入的基本思想就是把類的依賴從類內部轉化到外 部以減少依賴

應用控制反轉,物件在被建立的時候,由一個調控系統內所有物件的外界實體,將其所依賴的物件的引用,傳遞給它。也可以說,依賴被注入到物件中。所 以,控制反轉是,關於一個物件如何獲取他所依賴的物件的引用,這個責任的反轉。

7.spring有兩種代理方式

若目標物件實現了若干介面,spring使用JDK的java.lang.reflect.Proxy類代理。

      優點:因為有介面,所以使系統更加鬆耦合

      缺點:為每一個目標類建立介面

若目標物件沒有實現任何介面,spring使用CGLIB庫生成目標物件的子類。

      優點:因為代理類與目標類是繼承關係,所以不需要有介面的存在。

      缺點:因為沒有使用介面,所以系統的耦合性沒有使用JDK的動態代理好。

7、解釋Spring支援的幾種bean的作用域。 

Spring容器中的bean可以分為5個範圍:

(1)singleton:這種bean範圍是預設的,這種範圍確保不管接受到多少個請求,每個容器中只有一個bean的例項,單例的模式由bean factory自身來維護。
(2)prototype:原形範圍與單例範圍相反,為每一個bean請求提供一個例項。
(3)request:在請求bean範圍內會每一個來自客戶端的網路請求建立一個例項,在請求完成以後,bean會失效並被垃圾回收器回收。
(4)Session:與請求範圍類似,確保每個session中有一個bean的例項,在session過期後,bean會隨之失效。
(5)global-session:global-session和Portlet應用相關。當你的應用部署在Portlet容器中工作時,它包含很多portlet。如果你想要宣告讓所有的portlet共用全域性的儲存變數的話,那麼這全域性變數需要儲存在global-session中。全域性作用域與Servlet中的session作用域效果相同。

8、Spring中bean的載入過程

(1)獲取配置檔案資源;

(2)對獲取的xml資源進行一定的處理檢驗;

(3)處理包裝資源;

(4)解析處理包裝過後的資源;

(5)載入提取bean並註冊(新增到beanDefinitionMap中)。

9、Spring框架中的單例Beans是執行緒安全的麼?

Spring框架並沒有對單例bean進行任何多執行緒的封裝處理。關於單例bean的執行緒安全和併發問題需要開發者自行去搞定。但實際上,大部分的Spring bean並沒有可變的狀態(比如Serview類和DAO類),所以在某種程度上說Spring的單例bean是執行緒安全的。如果你的bean有多種狀態的話(比如 View Model 物件),就需要自行保證執行緒安全。
最淺顯的解決辦法就是將多型bean的作用域由“singleton”變更為“prototype”。

10、Spring事務的實現方式和實現原理

(1)劃分處理單元——IOC:

由於spring解決的問題是對單個數據庫進行區域性事務處理的,具體的實現首相用spring中的IOC劃分了事務處理單元。並且將對事務的各種配置放到了ioc容器中(設定事務管理器,設定事務的傳播特性及隔離機制)。

(2)AOP攔截需要進行事務處理的類:

Spring事務處理模組是通過AOP功能來實現宣告式事務處理的,具體操作(比如事務實行的配置和讀取,事務物件的抽象),用TransactionProxyFactoryBean介面來使用AOP功能,生成proxy代理物件,通過TransactionInterceptor完成對代理方法的攔截,將事務處理的功能編織到攔截的方法中。 

讀取ioc容器事務配置屬性,轉化為spring事務處理需要的內部資料結構(TransactionAttributeSourceAdvisor),轉化為TransactionAttribute表示的資料物件。 

(3)對事物處理實現(事務的生成、提交、回滾、掛起):

spring委託給具體的事務處理器實現。實現了一個抽象和適配。適配的具體事務處理器:DataSource資料來源支援、hibernate資料來源事務處理支援、JDO資料來源事務處理支援,JPA、JTA資料來源事務處理支援。這些支援都是通過設計PlatformTransactionManager、AbstractPlatforTransaction一系列事務處理的支援。為常用資料來源支援提供了一系列的TransactionManager。

(4)結合:

PlatformTransactionManager實現了TransactionInterception介面,讓其與TransactionProxyFactoryBean結合起來,形成一個Spring宣告式事務處理的設計體系。

11、解釋一下Spring AOP裡面的幾個名詞

(1)切面(Aspect):一個關注點的模組化,這個關注點可能會橫切多個物件。事務管理是J2EE應用中一個關於橫切關注點的很好的例子。 在Spring AOP中,切面可以使用通用類(基於模式的風格) 或者在普通類中以 @Aspect 註解(@AspectJ風格)來實現。

(2)連線點(Joinpoint):在程式執行過程中某個特定的點,比如某方法呼叫的時候或者處理異常的時候。 在Spring AOP中,一個連線點 總是 代表一個方法的執行。 通過宣告一個org.aspectj.lang.JoinPoint型別的引數可以使通知(Advice)的主體部分獲得連線點資訊。

(3)通知(Advice):在切面的某個特定的連線點(Joinpoint)上執行的動作。通知有各種型別,其中包括“around”、“before”和“after”等通知。 通知的型別將在後面部分進行討論。許多AOP框架,包括Spring,都是以攔截器做通知模型, 並維護一個以連線點為中心的攔截器鏈。

(4)切入點(Pointcut):匹配連線點(Joinpoint)的斷言。通知和一個切入點表示式關聯,並在滿足這個切入點的連線點上執行(例如,當執行某個特定名稱的方法時)。 切入點表示式如何和連線點匹配是AOP的核心:Spring預設使用AspectJ切入點語法。

(5)引入(Introduction):(也被稱為內部型別宣告(inter-type declaration))。宣告額外的方法或者某個型別的欄位。 Spring允許引入新的介面(以及一個對應的實現)到任何被代理的物件。例如,你可以使用一個引入來使bean實現 IsModified 介面,以便簡化快取機制。

(6)目標物件(Target Object): 被一個或者多個切面(aspect)所通知(advise)的物件。也有人把它叫做 被通知(advised) 物件。 既然Spring AOP是通過執行時代理實現的,這個物件永遠是一個 被代理(proxied) 物件。

(7)織入(Weaving):把切面(aspect)連線到其它的應用程式型別或者物件上,並建立一個被通知(advised)的物件。 這些可以在編譯時(例如使用AspectJ編譯器),類載入時和執行時完成。 Spring和其他純Java AOP框架一樣,在執行時完成織入。

切入點(pointcut)和連線點(join point)匹配的概念是AOP的關鍵,這使得AOP不同於其它僅僅提供攔截功能的舊技術。 切入點使得定位通知(advice)可獨立於OO層次。 例如,一個提供宣告式事務管理的around通知可以被應用到一組橫跨多個物件中的方法上(例如服務層的所有業務操作)。

12、通知有哪些型別?

(1)前置通知(Before advice):在某連線點(join point)之前執行的通知,但這個通知不能阻止連線點前的執行(除非它丟擲一個異常)。

(2)返回後通知(After returning advice):在某連線點(join point)正常完成後執行的通知:例如,一個方法沒有丟擲任何異常,正常返回。 
(3)丟擲異常後通知(After throwing advice):在方法丟擲異常退出時執行的通知。 
(4)後通知(After (finally) advice):當某連線點退出的時候執行的通知(不論是正常返回還是異常退出)。 
(5)環繞通知(Around Advice):包圍一個連線點(join point)的通知,如方法呼叫。這是最強大的一種通知型別。 環繞通知可以在方法呼叫前後完成自定義的行為。它也會選擇是否繼續執行連線點或直接返回它們自己的返回值或丟擲異常來結束執行。 
環繞通知是最常用的一種通知型別。大部分基於攔截的AOP框架,例如Nanning和JBoss4,都只提供環繞通知。