溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Java之Spring知識點(diǎn)

發(fā)布時間:2020-09-01 19:55:50 來源:網(wǎng)絡(luò) 閱讀:570 作者:霜花似雪 欄目:數(shù)據(jù)庫

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

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

實(shí)現(xiàn)AOP有幾種方式:

1. Spring 1.2版本中通過ProxyFactoryBean來實(shí)現(xiàn)aop,即通過動態(tài)代理來實(shí)現(xiàn)的,Aspect必須繼承MethodBeforeAdvice,MethodAfterAdvice等

2. Spring 2.0 AOP需要改的是FBI 這個類,而且它也不需要再實(shí)現(xiàn)某些接口

3. 三使用標(biāo)注(@AspectJ)實(shí)現(xiàn)AOP


AOP 和 OOP的區(qū)別:

1. 面向方面編程 AOP 偏重業(yè)務(wù)處理過程的某個步驟或階段,強(qiáng)調(diào)降低模塊之間的耦合度,使代碼擁有更好的移植性。

2. 面向?qū)ο缶幊?(oop) 則是對業(yè)務(wù)分析中抽取的實(shí)體進(jìn)行方法和屬性的封裝。

也可以說 AOP 是面向業(yè)務(wù)中的動詞領(lǐng)域, OOP 面向名詞領(lǐng)域。

AOP 的一個很重要的特點(diǎn)是源代碼無關(guān)性,也就是說如果我們的系統(tǒng)中引用了 AOP 組件,即使我們把該組件去掉,系統(tǒng)代碼也應(yīng)該能夠編譯通過。要實(shí)現(xiàn)這一點(diǎn),可以使用動態(tài) proxy 模式。


AOP將散落在系統(tǒng)中的“方面”代碼集中實(shí)現(xiàn);AOP有助于提高系統(tǒng)可維護(hù)性;AOP是一種設(shè)計(jì)模式,Spring提供了一種實(shí)現(xiàn);


2.PROPAGATION_REQUIRED

如果當(dāng)前沒有事務(wù),就新建一個事務(wù),如果已經(jīng)存在一個事務(wù)中,加入到這個事務(wù)中。這是最常見的選擇。

PROPAGATION_SUPPORTS

支持當(dāng)前事務(wù),如果當(dāng)前沒有事務(wù),就以非事務(wù)方式執(zhí)行。

PROPAGATION_MANDATORY

使用當(dāng)前的事務(wù),如果當(dāng)前沒有事務(wù),就拋出異常。

PROPAGATION_REQUIRES_NEW

新建事務(wù),如果當(dāng)前存在事務(wù),把當(dāng)前事務(wù)掛起。

PROPAGATION_NOT_SUPPORTED

以非事務(wù)方式執(zhí)行操作,如果當(dāng)前存在事務(wù),就把當(dāng)前事務(wù)掛起。

PROPAGATION_NEVER

以非事務(wù)方式執(zhí)行,如果當(dāng)前存在事務(wù),則拋出異常。

PROPAGATION_NESTED

如果當(dāng)前存在事務(wù),則在嵌套事務(wù)內(nèi)執(zhí)行。如果當(dāng)前沒有事務(wù),則執(zhí)行與PROPAGATION_REQUIRED類似的操作。


3.Spring的依賴注入:

依賴注入通常有如下兩種:設(shè)置注入和構(gòu)造注入:

構(gòu)造注入可以在構(gòu)造器中決定依賴關(guān)系的注入順序,優(yōu)先依賴的優(yōu)先注入

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


4.DispatcherServlet是前端控制器設(shè)計(jì)模式的實(shí)現(xiàn),提供Spring Web MVC的集中訪問點(diǎn),而且負(fù)責(zé)職責(zé)的分派,

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

DispatcherServlet主要用作職責(zé)調(diào)度工作,本身主要用于控制流程,主要職責(zé)如下:

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

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

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

4、通過ViewResolver解析邏輯視圖名到具體視圖實(shí)現(xiàn);

5、本地化解析;

6、渲染具體的視圖等;

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

Spring MVC的核心控制器DispatcherServlet它負(fù)責(zé)接收HTTP請求,加載配置文件,初始化上下應(yīng)用對象ApplicationContext。


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


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

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


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


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

DBCP數(shù)據(jù)源

C3P0數(shù)據(jù)源

Spring的數(shù)據(jù)源實(shí)現(xiàn)類(DriverManagerDataSource)

獲取JNDI數(shù)據(jù)源


9.在Servlet里,能實(shí)現(xiàn)重定向的方法是:

運(yùn)用javax.servlet.http.HttpServletResponse接口的sendRedirect方法.

sendRedirect方法 是重定向

forward方法  是請求轉(zhuǎn)發(fā)


10.sendRedirect():

重定向,讓客戶完成工作,即地址欄發(fā)生改變,可以轉(zhuǎn)向外部資源。 該方法參數(shù)為String。使用相對URL作為參數(shù)。帶/的相對原先的URL建立完整URL。不帶/的相對Web應(yīng)用建立。

 forward ( ):

 請求分派,服務(wù)器的內(nèi)部轉(zhuǎn)發(fā),對客戶是透明的(地址欄不發(fā)生改變)。

基于Servlet API可以通過forward方法實(shí)現(xiàn)轉(zhuǎn)向時不在地址欄中顯示轉(zhuǎn)向后的地址


11.1. Java Servlet API 中引用 Session 機(jī)制來追蹤客戶的狀態(tài)。Servlet API 中定義了 javax.servlet.http.HttpSession 接口,Servlet 容器必須實(shí)現(xiàn)這個接口。

2.當(dāng)一個 Session 開始時,Servlet 容器將創(chuàng)建一個 HttpSession 對象,Servlet 容器為 HttpSession 分配一個唯一標(biāo)識符,稱為 Session ID。Servlet 容器將 Session ID 作為 Cookie 保存在客戶的瀏覽器中。每次客戶發(fā)出 HTTP 請求時,Servlet 容器可以從 HttpRequest 對象中讀取 Session ID,然后根據(jù) Session ID 找到相應(yīng)的 HttpSession 對象,從而獲取客戶的狀態(tài)信息。

3.當(dāng)客戶端瀏覽器中禁止 Cookie,Servlet 容器無法從客戶端瀏覽器中取得作為 Cookie 的 Session ID,也就無法跟蹤客戶狀態(tài)。  

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

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

該方法的實(shí)現(xiàn)機(jī)制為:   

● 先判斷當(dāng)前的 Web 組件是否啟用 Session,如果沒有啟用 Session,直接返回參數(shù) url。   

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

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

修改前:

<a href=“maillogin.jsp“>   

修改后:  

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


12.事務(wù)屬性的種類:傳播行為、隔離級別、只讀和事務(wù)超時

a)傳播行為定義了被調(diào)用方法的事務(wù)邊界。

 

傳播行為     意義

1.PROPERGATION_MANDATORY

表示方法必須運(yùn)行在一個事務(wù)中,如果當(dāng)前事務(wù)不存在,就拋出異常

2.PROPAGATION_NESTED

表示如果當(dāng)前事務(wù)存在,則方法應(yīng)該運(yùn)行在一個嵌套事務(wù)中。

3.PROPAGATION_NEVER

表示方法不能運(yùn)行在一個事務(wù)中,否則拋出異常

4.PROPAGATION_NOT_SUPPORTED

表示方法不能運(yùn)行在一個事務(wù)中,如果當(dāng)前存在一個事務(wù),則該方法將被掛起

5.PROPAGATION_REQUIRED

表示當(dāng)前方法必須運(yùn)行在一個事務(wù)中,如果當(dāng)前存在一個事務(wù),那么該方法運(yùn)行在這個事務(wù)中,否則,將創(chuàng)建一個新的事務(wù)

6.PROPAGATION_REQUIRES_NEW

表示當(dāng)前方法必須運(yùn)行在自己的事務(wù)中,如果當(dāng)前存在一個事務(wù),那么這個事務(wù)將在該方法運(yùn)行期間被掛起

7.PROPAGATION_SUPPORTS

表示當(dāng)前方法不需要運(yùn)行在一個是事務(wù)中,但如果有一個事務(wù)已經(jīng)存在,該方法也可以運(yùn)行在這個事務(wù)中

 

b) 隔離級別

在操作數(shù)據(jù)時可能帶來 3 個副作用,分別是臟讀、不可重復(fù)讀、幻讀。

為了避免這 3 中副作用的發(fā)生,在標(biāo)準(zhǔn)的 SQL 語句中定義了 4 種隔離級別,

分別是未提交讀、已提交讀、可重復(fù)讀、可序列化。

而在 spring 事務(wù)中提供了5種隔離級別來對應(yīng)在 SQL 中定義的 4 種隔離級別,

如下:

隔離級別     意義

1.ISOLATION_DEFAULT  使用后端數(shù)據(jù)庫默認(rèn)的隔離級別

2.ISOLATION_READ_UNCOMMITTED

允許讀取未提交的數(shù)據(jù)(對應(yīng)未提交讀),可能導(dǎo)致臟讀、不可重復(fù)讀、幻讀

3.ISOLATION_READ_COMMITTED

允許在一個事務(wù)中讀取另一個已經(jīng)提交的事務(wù)中的數(shù)據(jù)(對應(yīng)已提交讀)。可以避免臟讀,但是無法避免不可重復(fù)讀和幻讀

4.ISOLATION_REPEATABLE_READ

一個事務(wù)不可能更新由另一個事務(wù)修改但尚未提交(回滾)的數(shù)據(jù)(對應(yīng)可重復(fù)讀)。

可以避免臟讀和不可重復(fù)讀,但無法避免幻讀

5.ISOLATION_SERIALIZABLE

這種隔離級別是所有的事務(wù)都在一個執(zhí)行隊(duì)列中,依次順序執(zhí)行,而不是并行(對應(yīng)可序列化)。可以避免臟讀、不可重復(fù)讀、幻讀。但是這種隔離級別效率很低,因此,除非必須,否則不建議使用。

 

c)只讀

如果在一個事務(wù)中所有關(guān)于數(shù)據(jù)庫的操作都是只讀的,也就是說,這些操作只讀取數(shù)據(jù)庫中的數(shù)據(jù),而并不更新數(shù)據(jù),那么應(yīng)將事務(wù)設(shè)為只讀模式(READ_ONLY_MARKER) , 這樣更有利于數(shù)據(jù)庫進(jìn)行優(yōu)化 。

因?yàn)橹蛔x的優(yōu)化措施是事務(wù)啟動后由數(shù)據(jù)庫實(shí)施的,因此,只有將那些具有可能啟動新事務(wù)的傳播行為 (PROPAGATION_NESTED 、 PROPAGATION_REQUIRED 、 PROPAGATION_REQUIRED_NEW) 的方法的事務(wù)標(biāo)記成只讀才有意義。

如果使用 Hibernate 作為持久化機(jī)制,那么將事務(wù)標(biāo)記為只讀后,會將 Hibernate 的 flush 模式設(shè)置為 FULSH_NEVER, 以告訴 Hibernate 避免和數(shù)據(jù)庫之間進(jìn)行不必要的同步,并將所有更新延遲到事務(wù)結(jié)束。

d) 事務(wù)超時

如果一個事務(wù)長時間運(yùn)行,這時為了盡量避免浪費(fèi)系統(tǒng)資源,應(yīng)為這個事務(wù)設(shè)置一個有效時間,使其等待數(shù)秒后自動回滾。

與設(shè)置“只讀”屬性一樣,事務(wù)有效屬性也需要給那些具有可能啟動新事物的傳播

行為的方法的事務(wù)標(biāo)記成只讀才有意義。


13.Spring特性中IoC的描述:

所謂“控制反轉(zhuǎn)”是指控制權(quán)由應(yīng)用代碼轉(zhuǎn)到外部容器,即控制權(quán)的轉(zhuǎn)移。

IoC將控制創(chuàng)建的職責(zé)搬進(jìn)了框架中,從應(yīng)用代碼脫離開來。

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


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

1. Spring Core: Core封裝包是框架的最基礎(chǔ)部分,提供IOC和依賴注入特性。這里的基礎(chǔ)概念是BeanFactory,它提供對Factory模式的經(jīng)典實(shí)現(xiàn)來消除對程序性單例模式的需要,并真正地允許你從程序邏輯中分離出依賴關(guān)系和配置。

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

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

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

利用ORM封裝包,可以混合使用所有Spring提供的特性進(jìn)行“對象/關(guān)系”映射,

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

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

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

7.Spring Web MVC: Spring中的MVC封裝包提供了Web應(yīng)用的Model-View-Controller(MVC)實(shí)現(xiàn)。Spring的MVC框架并不是僅僅提供一種傳統(tǒng)的實(shí)現(xiàn),它提供了一種清晰的分離模型,在領(lǐng)域模型代碼和Web Form之間。并且,還可以借助Spring框架的其他特性。


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

如果Bean類有實(shí)現(xiàn)org.springframework.beans.factory.BeanFactoryAware接口,

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

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

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

則執(zhí)行他的destroy()方法。


創(chuàng)建:<bean name=”” class=”” 額外屬性>

初始化:配置init-method/實(shí)現(xiàn)接口InitializingBean

調(diào)用:context.getBean(),進(jìn)行方法的調(diào)用

銷毀:配置destroy-method/實(shí)現(xiàn)DisposableBean接口。


16.Spring提供的DAO(數(shù)據(jù)訪問對象)支持主要的目的是便于以標(biāo)準(zhǔn)的方式使用不同的數(shù)據(jù)訪問技術(shù)。 

簡化 DAO 組件的開發(fā)。 

Spring提供了一套抽象DAO類供你擴(kuò)展。這些抽象類提供了一些方法,用來簡化代碼開發(fā)。 IoC 容器的使用,提供了 DAO 組件與業(yè)務(wù)邏輯組件之間的解耦。所有的 DAO 組件,都由容器負(fù)責(zé)注入到業(yè)務(wù)邏輯組件中,其業(yè)務(wù)組件無須關(guān)心 DAO 組件的實(shí)現(xiàn)。 面向接口編程及 DAO 模式的使用,提高了系統(tǒng)組件之間的解耦,

降低了系統(tǒng)重構(gòu)的成本。 

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

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

為RuntimeException; 開發(fā)者可選擇在恰當(dāng)?shù)膶犹幚頂?shù)據(jù)中不可恢復(fù)的異常,

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

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


17.spring mvc 和struts2的區(qū)別:

1.spring mvc是基于方法的設(shè)計(jì),而struts2是基于類的設(shè)計(jì)。

2.struts2有以自己的interceptor機(jī)制,spring mvc用的是獨(dú)立的AOP方式。

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

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

補(bǔ)充幾點(diǎn)知識: 

《 Filter 實(shí)現(xiàn)javax.servlet.Filter接口,在web.xml中配置與標(biāo)簽指定使用哪個

Filter實(shí)現(xiàn)類過濾哪些URL鏈接。只在web啟動時進(jìn)行初始化操作。 

filter 流程是線性的,url傳來之后,檢查之后,可保持原來的流程繼續(xù)向下執(zhí)行,

被下一個filter, servlet接收等,而servlet 處理之后,不會繼續(xù)向下傳遞。

filter功能可用來保持流程繼續(xù)按照原來的方式進(jìn)行下去,或者主導(dǎo)流程,而servlet的功能主要用來主導(dǎo)流程。  

特點(diǎn):可以在響應(yīng)之前修改Request和Response的頭部,只能轉(zhuǎn)發(fā)請求,不能直接發(fā)出響應(yīng)。

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

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

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

 spring3 mvc是方法級別的攔截,攔截到方法后根據(jù)參數(shù)上的注解,把request數(shù)據(jù)注入進(jìn)去,在spring3 mvc中,一個方法對應(yīng)一個request上下文。 而struts2框架是類級別的攔截,每次來了請求就創(chuàng)建一個Action,然后調(diào)用setter getter方法把request中的數(shù)據(jù)注入;struts2實(shí)際上是通過setter getter方法與request打交道的;struts2中,一個Action對象對應(yīng)一個request上下文。 

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

7. 設(shè)計(jì)思想上: struts更加符合oop的編程思想 , spring就比較謹(jǐn)慎,在servlet上擴(kuò)展。 

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

9. 另外,spring3 mvc的驗(yàn)證也是一個亮點(diǎn),支持JSR303, 處理ajax的請求更是方便 ,只需一個注解 @ResponseBody  ,然后直接返回響應(yīng)文本即可。 


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

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

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

spring依賴注入:

IOC就是由spring來負(fù)責(zé)控制對象的生命周期和對象間的關(guān)系。

BeanFacotry是最簡單的容器,提供了基礎(chǔ)的依賴注入支持。 ApplicationContext建立在BeanFacotry之上,提供了系統(tǒng)構(gòu)架服務(wù)。


19.spring沒有提供AOP方式的日志系統(tǒng)

AOP為Aspect Oriented Programming的縮寫,意為:面向切面編程,通過預(yù)編譯方式和運(yùn)行期動態(tài)代理實(shí)現(xiàn)程序功能的統(tǒng)一維護(hù)的一種技術(shù)。AOP是OOP的延續(xù),是軟件開發(fā)中的一個熱點(diǎn),也是Spring框架中的一個重要內(nèi)容,是函數(shù)式編程的一種衍生范型。

Spring通過對AOP的支持,借助log4j等Apache開源組件實(shí)現(xiàn)了日志系統(tǒng)。

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


20.Servlet是一個特殊的Java類,它必須直接或間接實(shí)現(xiàn)Servlet接口。

Servlet客戶線程調(diào)用service方法響應(yīng)客戶的請求。 servlet接口定義了servlet的生命周期方法:init()、service()、destory()三個方法 當(dāng)多個瀏覽器終端請求web服務(wù)器的時候,服務(wù)器為每個客戶啟動一個線程,不是進(jìn)程。 import javax.servlet.http.httpservletrequest,你看這個包說明servlet是一個特殊的Java類, java和javax都是Java的API包,java是核心包,javax的x是extension的意思,也就是擴(kuò)展包。  


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

1. Spring中涉及到事務(wù)管理的API有100多個,核心的只有三個: TransactionDefinition、PlatformTransactionManager、TransactionStatus。所謂事務(wù)管理,其實(shí)就是“按照給定的事務(wù)規(guī)則來執(zhí)行提交或者回滾操作”。“給定的事務(wù)規(guī)則”就是用 TransactionDefinition 表示的,“按照……來執(zhí)行提交或者回滾操作”便是用 PlatformTransactionManager 來表示,而 TransactionStatus 用于表示一個運(yùn)行著的事務(wù)的狀態(tài)。

2. TransactionDefinition, 該接口在前面已經(jīng)介紹過,它用于定義一個事務(wù)。它包含了事務(wù)的靜態(tài)屬性,比如:事務(wù)傳播行為、超時時間等等。Spring 為我們提供了一個默認(rèn)的實(shí)現(xiàn)類:DefaultTransactionDefinition,該類適用于大多數(shù)情況。如果該類不能滿足需求,可以通過實(shí)現(xiàn) TransactionDefinition 接口來實(shí)現(xiàn)自己的事務(wù)定義。

3. PlatformTransactionManager  用于執(zhí)行具體的事務(wù)操作。

Public interface PlatformTransactionManager{

   TransactionStatus getTransaction(TransactionDefinition definition)  throws TransactionException;

   void commit(TransactionStatus status)throws TransactionException;

   void rollback(TransactionStatus status)throws TransactionException;

}

根據(jù)底層所使用的不同的持久化 API 或框架,PlatformTransactionManager 的主要實(shí)現(xiàn)類大致如下:

DataSourceTransactionManager :適用于使用JDBC和iBatis進(jìn)行數(shù)據(jù)持久化操作的情況。

HibernateTransactionManager :適用于使用Hibernate進(jìn)行數(shù)據(jù)持久化操作的情況。

JpaTransactionManager :適用于使用JPA進(jìn)行數(shù)據(jù)持久化操作的情況。

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

4. 編程式事務(wù)需要你在代碼中直接加入處理事務(wù)的邏輯,可能需要在代碼中顯式調(diào)用beginTransaction()、commit()、rollback()等事務(wù)管理相關(guān)的方法,如在執(zhí)行a方法時候需要事務(wù)處理,你需要在a方法開始時候開啟事務(wù),處理完后。在方法結(jié)束時候,關(guān)閉事務(wù). 聲明式的事務(wù)的做法是在a方法外圍添加注解或者直接在配置文件中定義,a方法需要事務(wù)處理,在spring中會通過配置文件在a方法前后攔截,并添加事務(wù). 二者區(qū)別.編程式事務(wù)侵入性比較強(qiáng),但處理粒度更細(xì). 相當(dāng)于一個是手動事務(wù),另一個是系統(tǒng)自動事務(wù)。 編程試事務(wù)就是需要手工寫代碼提交事務(wù),回滾事務(wù)等。 聲明性事務(wù)就是在配置文件里面定義一下什么時候需要事務(wù),到時候系統(tǒng)會自動commit,出異常了自動rollback,不需要在代碼里面寫commit或者rollback。


spring事務(wù):

spring事務(wù)可以分為編程式事務(wù)和聲明式事務(wù)。

spring提供了一個事務(wù)的接口 PaltformTractionManager接口,針對不同的事務(wù),spring進(jìn)行了不同的實(shí)現(xiàn)。

聲明式事務(wù)最大的優(yōu)點(diǎn)就是不需要通過編程的方式管理事務(wù),這樣就不需要在業(yè)務(wù)邏輯代碼中摻雜事務(wù)管理的代碼。





向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI