Java之Spring知識點

1.AOP的概念是Aspected Oriented Programming 面向方面編程。

好處:AOP將程序分解成各個方面或者說關注點。這使得可以模塊化,相當橫向上分切了。它可以解決OOP和過程化方法不能夠很好解決的橫切(crosscut)問題,如:事務、安全、日誌等橫切關注

實現AOP有幾種方式:

1. Spring 1.2版本中通過ProxyFactoryBean來實現aop,即通過動態代理來實現的,Aspect必須繼承MethodBeforeAdvice,MethodAfterAdvice等

2. Spring 2.0 AOP需要改的是FBI 這個類,而且它也不需要再實現某些接口

3. 三使用標註(@AspectJ)實現AOP


AOP 和 OOP的區別:

1. 面向方面編程 AOP 偏重業務處理過程的某個步驟或階段,強調降低模塊之間的耦合度,使代碼擁有更好的移植性。

2. 面向對象編程 (oop) 則是對業務分析中抽取的實體進行方法和屬性的封裝。

也可以說 AOP 是面向業務中的動詞領域, OOP 面向名詞領域。

AOP 的一個很重要的特點是源代碼無關性,也就是說如果我們的系統中引用了 AOP 組件,即使我們把該組件去掉,系統代碼也應該能夠編譯通過。要實現這一點,可以使用動態 proxy 模式。


AOP將散落在系統中的“方面”代碼集中實現;AOP有助於提高系統可維護性;AOP是一種設計模式,Spring提供了一種實現;


2.PROPAGATION_REQUIRED

如果當前沒有事務,就新建一個事務,如果已經存在一個事務中,加入到這個事務中。這是最常見的選擇。

PROPAGATION_SUPPORTS

支持當前事務,如果當前沒有事務,就以非事務方式執行。

PROPAGATION_MANDATORY

使用當前的事務,如果當前沒有事務,就拋出異常。

PROPAGATION_REQUIRES_NEW

新建事務,如果當前存在事務,把當前事務掛起。

PROPAGATION_NOT_SUPPORTED

以非事務方式執行操作,如果當前存在事務,就把當前事務掛起。

PROPAGATION_NEVER

以非事務方式執行,如果當前存在事務,則拋出異常。

PROPAGATION_NESTED

如果當前存在事務,則在嵌套事務內執行。如果當前沒有事務,則執行與PROPAGATION_REQUIRED類似的操作。


3.Spring的依賴注入:

依賴注入通常有如下兩種:設置注入和構造注入:

構造注入可以在構造器中決定依賴關係的注入順序,優先依賴的優先注入

設值注入是指IoC容器使用屬性的setter方法來注入被依賴的實例。這種注入方式比較簡單、直觀


4.DispatcherServlet是前端控制器設計模式的實現,提供Spring Web MVC的集中訪問點,而且負責職責的分派,

而且與Spring IoC容器無縫集成,從而可以獲得Spring的所有好處。

DispatcherServlet主要用作職責調度工作,本身主要用於控制流程,主要職責如下:

1、文件上傳解析,如果請求類型是multipart將通過MultipartResolver進行文件上傳解析;

2、通過HandlerMapping,將請求映射到處理器(返回一個HandlerExecutionChain,它包括一個處理器、多個HandlerInterceptor攔截器);

3、  通過HandlerAdapter支持多種類型的處理器(HandlerExecutionChain中的處理器);

4、通過ViewResolver解析邏輯視圖名到具體視圖實現;

5、本地化解析;

6、渲染具體的視圖等;

7、如果執行過程中遇到異常將交給HandlerExceptionResolver來解析。

Spring MVC的核心控制器DispatcherServlet它負責接收HTTP請求,加載配置文件,初始化上下應用對象ApplicationContext。


5.在J2EE中,使用Servlet過濾器,需要在web.xml中配置<filter>(過濾器),<filter-mapping>(過濾器映射)元素。


6.Servlet接口的方法有init方法。

Servlet的方法有init() 、 destroy() ,doGet(),doPost()等方法


7.Spring框架中的核心思想包括依賴注入,控制反轉,面向切面。


8.在Spring框架中獲取連接池的方式:

DBCP數據源

C3P0數據源

Spring的數據源實現類(DriverManagerDataSource)

獲取JNDI數據源


9.在Servlet裏,能實現重定向的方法是:

運用javax.servlet.http.HttpServletResponse接口的sendRedirect方法.

sendRedirect方法 是重定向

forward方法  是請求轉發


10.sendRedirect():

重定向,讓客戶完成工作,即地址欄發生改變,可以轉向外部資源。 該方法參數爲String。使用相對URL作爲參數。帶/的相對原先的URL建立完整URL。不帶/的相對Web應用建立。

 forward ( ):

 請求分派,服務器的內部轉發,對客戶是透明的(地址欄不發生改變)。

基於Servlet API可以通過forward方法實現轉向時不在地址欄中顯示轉向後的地址


11.1. Java Servlet API 中引用 Session 機制來追蹤客戶的狀態。Servlet API 中定義了 javax.servlet.http.HttpSession 接口,Servlet 容器必須實現這個接口。

2.當一個 Session 開始時,Servlet 容器將創建一個 HttpSession 對象,Servlet 容器爲 HttpSession 分配一個唯一標識符,稱爲 Session ID。Servlet 容器將 Session ID 作爲 Cookie 保存在客戶的瀏覽器中。每次客戶發出 HTTP 請求時,Servlet 容器可以從 HttpRequest 對象中讀取 Session ID,然後根據 Session ID 找到相應的 HttpSession 對象,從而獲取客戶的狀態信息。

3.當客戶端瀏覽器中禁止 Cookie,Servlet 容器無法從客戶端瀏覽器中取得作爲 Cookie 的 Session ID,也就無法跟蹤客戶狀態。  

Java Servlet API 中提出了跟蹤 Session 的另一種機制,如果客戶端瀏覽器不支持 Cookie,Servlet 容器可以重寫客戶請求的 URL,把 Session ID 添加到 URL 信息中。  

4. HttpServletResponse 接口提供了重寫 URL 的方法:public java.lang.String encodeURL(java.lang.String url)  

該方法的實現機制爲:   

● 先判斷當前的 Web 組件是否啓用 Session,如果沒有啓用 Session,直接返回參數 url。   

● 再判斷客戶端瀏覽器是否支持 Cookie,如果支持 Cookie,直接返回參數 url;如果不支持 Cookie,就在參數 url 中加入 Session ID 信息,然後返回修改後的 url。   

我們可以對網頁中的鏈接稍作修改,解決以上問題:

修改前:

<a href=“maillogin.jsp“>   

修改後:  

<a href=“<%=response.encodeURL(“maillogin.jsp“)%>“>    


12.事務屬性的種類:傳播行爲、隔離級別、只讀和事務超時

a)傳播行爲定義了被調用方法的事務邊界。

 

傳播行爲     意義

1.PROPERGATION_MANDATORY

表示方法必須運行在一個事務中,如果當前事務不存在,就拋出異常

2.PROPAGATION_NESTED

表示如果當前事務存在,則方法應該運行在一個嵌套事務中。

3.PROPAGATION_NEVER

表示方法不能運行在一個事務中,否則拋出異常

4.PROPAGATION_NOT_SUPPORTED

表示方法不能運行在一個事務中,如果當前存在一個事務,則該方法將被掛起

5.PROPAGATION_REQUIRED

表示當前方法必須運行在一個事務中,如果當前存在一個事務,那麼該方法運行在這個事務中,否則,將創建一個新的事務

6.PROPAGATION_REQUIRES_NEW

表示當前方法必須運行在自己的事務中,如果當前存在一個事務,那麼這個事務將在該方法運行期間被掛起

7.PROPAGATION_SUPPORTS

表示當前方法不需要運行在一個是事務中,但如果有一個事務已經存在,該方法也可以運行在這個事務中

 

b) 隔離級別

在操作數據時可能帶來 3 個副作用,分別是髒讀、不可重複讀、幻讀。

爲了避免這 3 中副作用的發生,在標準的 SQL 語句中定義了 4 種隔離級別,

分別是未提交讀、已提交讀、可重複讀、可序列化。

而在 spring 事務中提供了5種隔離級別來對應在 SQL 中定義的 4 種隔離級別,

如下:

隔離級別     意義

1.ISOLATION_DEFAULT  使用後端數據庫默認的隔離級別

2.ISOLATION_READ_UNCOMMITTED

允許讀取未提交的數據(對應未提交讀),可能導致髒讀、不可重複讀、幻讀

3.ISOLATION_READ_COMMITTED

允許在一個事務中讀取另一個已經提交的事務中的數據(對應已提交讀)。可以避免髒讀,但是無法避免不可重複讀和幻讀

4.ISOLATION_REPEATABLE_READ

一個事務不可能更新由另一個事務修改但尚未提交(回滾)的數據(對應可重複讀)。

可以避免髒讀和不可重複讀,但無法避免幻讀

5.ISOLATION_SERIALIZABLE

這種隔離級別是所有的事務都在一個執行隊列中,依次順序執行,而不是並行(對應可序列化)。可以避免髒讀、不可重複讀、幻讀。但是這種隔離級別效率很低,因此,除非必須,否則不建議使用。

 

c)只讀

如果在一個事務中所有關於數據庫的操作都是隻讀的,也就是說,這些操作只讀取數據庫中的數據,而並不更新數據,那麼應將事務設爲只讀模式(READ_ONLY_MARKER) , 這樣更有利於數據庫進行優化 。

因爲只讀的優化措施是事務啓動後由數據庫實施的,因此,只有將那些具有可能啓動新事務的傳播行爲 (PROPAGATION_NESTED 、 PROPAGATION_REQUIRED 、 PROPAGATION_REQUIRED_NEW) 的方法的事務標記成只讀纔有意義。

如果使用 Hibernate 作爲持久化機制,那麼將事務標記爲只讀後,會將 Hibernate 的 flush 模式設置爲 FULSH_NEVER, 以告訴 Hibernate 避免和數據庫之間進行不必要的同步,並將所有更新延遲到事務結束。

d) 事務超時

如果一個事務長時間運行,這時爲了儘量避免浪費系統資源,應爲這個事務設置一個有效時間,使其等待數秒後自動回滾。

與設置“只讀”屬性一樣,事務有效屬性也需要給那些具有可能啓動新事物的傳播

行爲的方法的事務標記成只讀纔有意義。


13.Spring特性中IoC的描述:

所謂“控制反轉”是指控制權由應用代碼轉到外部容器,即控制權的轉移。

IoC將控制創建的職責搬進了框架中,從應用代碼脫離開來。

使用Spring的IoC容器時只需指出組件需要的對象,在運行時Spring的IoC容器會根據XML配置數據提供給它。


14.Spring框架模塊,七大模塊,如下:

1. Spring Core: Core封裝包是框架的最基礎部分,提供IOC和依賴注入特性。這裏的基礎概念是BeanFactory,它提供對Factory模式的經典實現來消除對程序性單例模式的需要,並真正地允許你從程序邏輯中分離出依賴關係和配置。

2.Spring Context: 構建於Core封裝包基礎上的 Context封裝包,提供了一種框架式的對象訪問方法,有些象JNDI註冊器。Context封裝包的特性得自於Beans封裝包,並添加了對國際化(I18N)的支持(例如資源綁定),事件傳播,資源裝載的方式和Context的透明創建,比如說通過Servlet容器。

3.Spring DAO:  DAO (Data Access Object)提供了JDBC的抽象層,它可消除冗長的JDBC編碼和解析數據庫廠商特有的錯誤代碼。 並且,JDBC封裝包還提供了一種比編程性更好的聲明性事務管理方法,不僅僅是實現了特定接口,而且對所有的POJOs(plain old Java objects)都適用。

4.Spring ORM: ORM 封裝包提供了常用的“對象/關係”映射APIs的集成層。 其中包括JPA、JDO、Hibernate 和 iBatis 。

利用ORM封裝包,可以混合使用所有Spring提供的特性進行“對象/關係”映射,

如前邊提到的簡單聲明性事務管理。

5.Spring AOP: Spring的 AOP 封裝包提供了符合AOP Alliance規範的面向方面的編程實現,讓你可以定義,例如方法攔截器(method-interceptors)和切點(pointcuts),從邏輯上講,從而減弱代碼的功能耦合,清晰的被分離開。而且,利用source-level的元數據功能,還可以將各種行爲信息合併到你的代碼中。

6.Spring Web: Spring中的 Web 包提供了基礎的針對Web開發的集成特性,例如多方文件上傳,利用Servlet listeners進行IOC容器初始化和針對Web的ApplicationContext。當與WebWork或Struts一起使用Spring時,這個包使Spring可與其他框架結合。

7.Spring Web MVC: Spring中的MVC封裝包提供了Web應用的Model-View-Controller(MVC)實現。Spring的MVC框架並不是僅僅提供一種傳統的實現,它提供了一種清晰的分離模型,在領域模型代碼和Web Form之間。並且,還可以藉助Spring框架的其他特性。


15.spring對bean的生命週期的描述:

如果Bean類有實現org.springframework.beans.factory.BeanFactoryAware接口,

工廠調用setBeanFactory()方法傳入工廠自身。

可以在Bean定義文件中使用"init-method"屬性,

rg.springframework.beans.factory.DisposableBean接口,

則執行他的destroy()方法。


創建:<bean name=”” class=”” 額外屬性>

初始化:配置init-method/實現接口InitializingBean

調用:context.getBean(),進行方法的調用

銷燬:配置destroy-method/實現DisposableBean接口。


16.Spring提供的DAO(數據訪問對象)支持主要的目的是便於以標準的方式使用不同的數據訪問技術。 

簡化 DAO 組件的開發。 

Spring提供了一套抽象DAO類供你擴展。這些抽象類提供了一些方法,用來簡化代碼開發。 IoC 容器的使用,提供了 DAO 組件與業務邏輯組件之間的解耦。所有的 DAO 組件,都由容器負責注入到業務邏輯組件中,其業務組件無須關心 DAO 組件的實現。 面向接口編程及 DAO 模式的使用,提高了系統組件之間的解耦,

降低了系統重構的成本。 

方便的事務管理: Spring的聲明式事務管理力度是方法級。 

異常包裝:Spring能夠包裝Hibernate異常,把它們從CheckedException變

爲RuntimeException; 開發者可選擇在恰當的層處理數據中不可恢復的異常,

從而避免煩瑣的 catch/throw 及異常聲明。

Spring提供的DAO支持了JDBC、JDO和Hibernate。


17.spring mvc 和struts2的區別:

1.spring mvc是基於方法的設計,而struts2是基於類的設計。

2.struts2有以自己的interceptor機制,spring mvc用的是獨立的AOP方式。

3.spring mvc的方法之間基本上獨立的,獨享request response數據,struts2所有Action變量是共享的。

4.機制:spring mvc的入口是servlet,而struts2是filter。 

補充幾點知識: 

《 Filter 實現javax.servlet.Filter接口,在web.xml中配置與標籤指定使用哪個

Filter實現類過濾哪些URL鏈接。只在web啓動時進行初始化操作。 

filter 流程是線性的,url傳來之後,檢查之後,可保持原來的流程繼續向下執行,

被下一個filter, servlet接收等,而servlet 處理之後,不會繼續向下傳遞。

filter功能可用來保持流程繼續按照原來的方式進行下去,或者主導流程,而servlet的功能主要用來主導流程。  

特點:可以在響應之前修改Request和Response的頭部,只能轉發請求,不能直接發出響應。

filter可用來進行字符編碼的過濾,檢測用戶是否登陸的過濾,禁止頁面緩存等》 《 Servlet, servlet 流程是短的,url傳來之後,就對其進行處理,之後返回或轉向到某一自己指定的頁面。它主要用來在業務處理之前進行控制 》 

《 Listener呢?我們知道 servlet、filter都是針對url之類的,而listener是針對對象的操作的,如session的創建,session.setAttribute的發生,在這樣的事件發 生時做一些事情。 》  

5.性能:spring會稍微比struts快。 spring mvc是基於方法的設計 , 而sturts是基於類 ,每次發一次請求都會實例一個action,每個action都會被注入屬性,而spring基於方法,粒度更細(粒度級別的東西比較sychronized和lock),但要小心把握像在servlet控制數據一樣。 

 spring3 mvc是方法級別的攔截,攔截到方法後根據參數上的註解,把request數據注入進去,在spring3 mvc中,一個方法對應一個request上下文。 而struts2框架是類級別的攔截,每次來了請求就創建一個Action,然後調用setter getter方法把request中的數據注入;struts2實際上是通過setter getter方法與request打交道的;struts2中,一個Action對象對應一個request上下文。 

6. 參數傳遞:struts是在接受參數的時候,可以用屬性來接受參數,這就說明參數是讓多個方法共享的。

7. 設計思想上: struts更加符合oop的編程思想 , spring就比較謹慎,在servlet上擴展。 

8. intercepter(攔截器)的實現機制:struts有以自己的interceptor機制, spring mvc用的是獨立的AOP方式 。這樣導致struts的配置文件量還是比spring mvc大,雖然struts的配置能繼承,所以我覺得,就拿使用上來講,spring mvc使用更加簡潔, 開發效率Spring MVC確實比struts2高 。 spring mvc是方法級別的攔截,一個方法對應一個request上下文,而方法同時又跟一個url對應,所以說從架構本身上 spring3 mvc就容易實現restful url 。 struts2是類級別的攔截,一個類對應一個request上下文;實現restful url要費勁,因爲struts2 action的一個方法可以對應一個url;而其類屬性卻被所有方法共享,這也就無法用註解或其他方式標識其所屬方法了。spring3 mvc的方法之間基本上獨立的,獨享request response數據,請求數據通過參數獲取,處理結果通過ModelMap交回給框架方法之間不共享變量, 而struts2搞的就比較亂,雖然方法之間也是獨立的,但其所有Action變量是共享的,這不會影響程序運行,卻給我們編碼,讀程序時帶來麻煩。 

9. 另外,spring3 mvc的驗證也是一個亮點,支持JSR303, 處理ajax的請求更是方便 ,只需一個註解 @ResponseBody  ,然後直接返回響應文本即可。 


18.spring的IOC容器能夠幫我們自動new對象,對象交給spring管之後我們不用自己手動去new對象了,也就是控制權的轉讓。

spring使用BeanFactory來實例化、配置和管理對象,但是它只是一個接口,裏面有一個getBean()方法。

我們一般都不直接用BeanFactory,而是用它的實現類 ApplicationContext ,這個類會自動解析我們配置的applicationContext.

spring依賴注入:

IOC就是由spring來負責控制對象的生命週期和對象間的關係。

BeanFacotry是最簡單的容器,提供了基礎的依賴注入支持。 ApplicationContext建立在BeanFacotry之上,提供了系統構架服務。


19.spring沒有提供AOP方式的日誌系統

AOP爲Aspect Oriented Programming的縮寫,意爲:面向切面編程,通過預編譯方式和運行期動態代理實現程序功能的統一維護的一種技術。AOP是OOP的延續,是軟件開發中的一個熱點,也是Spring框架中的一個重要內容,是函數式編程的一種衍生範型。

Spring通過對AOP的支持,藉助log4j等Apache開源組件實現了日誌系統。

Spring是一系列輕量級Java EE框架的集合。Spring中包含一個“依賴注入”模式的實現。使用Spring可以實現聲明式事務。


20.Servlet是一個特殊的Java類,它必須直接或間接實現Servlet接口。

Servlet客戶線程調用service方法響應客戶的請求。 servlet接口定義了servlet的生命週期方法:init()、service()、destory()三個方法 當多個瀏覽器終端請求web服務器的時候,服務器爲每個客戶啓動一個線程,不是進程。 import javax.servlet.http.httpservletrequest,你看這個包說明servlet是一個特殊的Java類, java和javax都是Java的API包,java是核心包,javax的x是extension的意思,也就是擴展包。  


21.Spring的特色之一,簡單而強大的事務管理功能,包括編程式事務和聲明式事務。

1. Spring中涉及到事務管理的API有100多個,核心的只有三個: TransactionDefinition、PlatformTransactionManager、TransactionStatus。所謂事務管理,其實就是“按照給定的事務規則來執行提交或者回滾操作”。“給定的事務規則”就是用 TransactionDefinition 表示的,“按照……來執行提交或者回滾操作”便是用 PlatformTransactionManager 來表示,而 TransactionStatus 用於表示一個運行着的事務的狀態。

2. TransactionDefinition, 該接口在前面已經介紹過,它用於定義一個事務。它包含了事務的靜態屬性,比如:事務傳播行爲、超時時間等等。Spring 爲我們提供了一個默認的實現類:DefaultTransactionDefinition,該類適用於大多數情況。如果該類不能滿足需求,可以通過實現 TransactionDefinition 接口來實現自己的事務定義。

3. PlatformTransactionManager  用於執行具體的事務操作。

Public interface PlatformTransactionManager{

   TransactionStatus getTransaction(TransactionDefinition definition)  throws TransactionException;

   void commit(TransactionStatus status)throws TransactionException;

   void rollback(TransactionStatus status)throws TransactionException;

}

根據底層所使用的不同的持久化 API 或框架,PlatformTransactionManager 的主要實現類大致如下:

DataSourceTransactionManager :適用於使用JDBC和iBatis進行數據持久化操作的情況。

HibernateTransactionManager :適用於使用Hibernate進行數據持久化操作的情況。

JpaTransactionManager :適用於使用JPA進行數據持久化操作的情況。

另外還有JtaTransactionManager 、JdoTransactionManager、JmsTransactionManager等等。

4. 編程式事務需要你在代碼中直接加入處理事務的邏輯,可能需要在代碼中顯式調用beginTransaction()、commit()、rollback()等事務管理相關的方法,如在執行a方法時候需要事務處理,你需要在a方法開始時候開啓事務,處理完後。在方法結束時候,關閉事務. 聲明式的事務的做法是在a方法外圍添加註解或者直接在配置文件中定義,a方法需要事務處理,在spring中會通過配置文件在a方法前後攔截,並添加事務. 二者區別.編程式事務侵入性比較強,但處理粒度更細. 相當於一個是手動事務,另一個是系統自動事務。 編程試事務就是需要手工寫代碼提交事務,回滾事務等。 聲明性事務就是在配置文件裏面定義一下什麼時候需要事務,到時候系統會自動commit,出異常了自動rollback,不需要在代碼裏面寫commit或者rollback。


spring事務:

spring事務可以分爲編程式事務和聲明式事務。

spring提供了一個事務的接口 PaltformTractionManager接口,針對不同的事務,spring進行了不同的實現。

聲明式事務最大的優點就是不需要通過編程的方式管理事務,這樣就不需要在業務邏輯代碼中摻雜事務管理的代碼。





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章