溫馨提示×

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

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

程序員筆記|Spring IoC、面向切面編程、事務(wù)管理等Spring基本概念詳解

發(fā)布時(shí)間:2020-07-17 13:49:16 來(lái)源:網(wǎng)絡(luò) 閱讀:301 作者:宜信技術(shù) 欄目:軟件技術(shù)

一、Spring IoC

1.1 重要概念

1)控制反轉(zhuǎn)(Inversion of control)

控制反轉(zhuǎn)是一種通過(guò)描述(在java中通過(guò)xml或者注解)并通過(guò)第三方去產(chǎn)生或獲取特定對(duì)象的方式。

控制反轉(zhuǎn)IoC(Inversion of Control)是說(shuō)創(chuàng)建對(duì)象的控制權(quán)進(jìn)行轉(zhuǎn)移,以前創(chuàng)建對(duì)象的主動(dòng)權(quán)和創(chuàng)建時(shí)機(jī)是由自己把控的,而現(xiàn)在這種權(quán)力轉(zhuǎn)移到第三方,比如轉(zhuǎn)移交給了IoC容器,它就是一個(gè)專門用來(lái)創(chuàng)建對(duì)象的工廠,你要什么對(duì)象,它就給你什么對(duì)象,有了 IoC容器,依賴關(guān)系就變了,原先的依賴關(guān)系就沒(méi)了,它們都依賴IoC容器了,通過(guò)IoC容器來(lái)建立它們之間的關(guān)系。

控制反轉(zhuǎn)就是獲取依賴對(duì)象的方式反轉(zhuǎn)了,正常情況下由應(yīng)用程序主動(dòng)創(chuàng)建依賴對(duì)象,實(shí)現(xiàn)對(duì)依賴對(duì)象的管理,創(chuàng)建依賴對(duì)象的控制權(quán)在應(yīng)用程序手中,應(yīng)用程序需要什么對(duì)象,就主動(dòng)去創(chuàng)建這個(gè)對(duì)象,這是正轉(zhuǎn)的情況。實(shí)現(xiàn)控制反轉(zhuǎn)之后,由IoC容器實(shí)現(xiàn)依賴對(duì)象的創(chuàng)建和管理,應(yīng)用程序需要什么樣的對(duì)象,IoC容器就根據(jù)需求創(chuàng)建這個(gè)對(duì)象,應(yīng)用程序只是被動(dòng)地接收和使用這個(gè)對(duì)象,依賴對(duì)象的創(chuàng)建管理控制權(quán)由應(yīng)用程序轉(zhuǎn)移給了IoC容器,這就實(shí)現(xiàn)了控制反轉(zhuǎn)。

2)依賴注入(Dependency Injection)

控制反轉(zhuǎn)的另一種表述方式,即讓調(diào)用類對(duì)某一接口的實(shí)現(xiàn)類的依賴關(guān)系由第三方(容器或協(xié)作類)注入,用以移除調(diào)用類對(duì)某一接口實(shí)現(xiàn)類的依賴。

3)Beanfacory 和ApplicationContext

Spring通過(guò)配置文件描述Bean以及Bean之間的依賴關(guān)系,利用Java語(yǔ)言的反射功能實(shí)例化Bean并建立起B(yǎng)ean之間的依賴關(guān)系。Spring的IoC容器在完成這些底層工作的基礎(chǔ)上,提供了Bean實(shí)例緩存、生命周期管理、Bean實(shí)例代理、事件發(fā)布、資源裝載等服務(wù)。

Beanfacory 是Spring框架最核心的接口,提供了高級(jí)IoC的配置機(jī)制。Beanfacory使管理不同的java對(duì)象成為可能,ApplicationContext(應(yīng)用上下文)建立在Beanfacory基礎(chǔ)之上,提供更多面向引用的功能。Beanfacory 即為IoC容器,由于ApplicationContext建立在Beanfacory,我們也稱ApplicationContext為IoC容器。

IoC容器主要功能

  • 動(dòng)態(tài)創(chuàng)建、注入依賴對(duì)象。

  • 管理對(duì)象生命周期。

  • 映射依賴關(guān)系。

實(shí)現(xiàn)IoC容器的方式

  • 依賴查找。

  • 依賴注入。

依賴注入的三種方式

  • 構(gòu)造器注入。
  • etter注入。
  • 接口注入。

注入和裝配的區(qū)別

注入是實(shí)例化一個(gè)類時(shí)對(duì)類中各個(gè)參數(shù)的賦值方式。

裝配是定義bean以及bean之間關(guān)系。

  • 裝配bean概述:

    • 基于xml中配置。

    • 基于注解中配置。

    • 基于java類配置。

    • 基于Groovy DSL配置。
  • Bean作用域:

    • 單例(singleton):它是默認(rèn)的選項(xiàng),在整個(gè)應(yīng)用中,Spring只為其生成一個(gè)Bean的實(shí)例。

    • 原型(prototype):每次注入時(shí),或者通過(guò)Spring IoC容器獲取Bean時(shí),Spring都會(huì)為它創(chuàng)建一個(gè)新的實(shí)例。

    • 會(huì)話(session):在web應(yīng)用中使用,就是在會(huì)話過(guò)程中Spring只會(huì)創(chuàng)建一個(gè)實(shí)例。

    • 請(qǐng)求(request):在web應(yīng)用中使用,就是在一次請(qǐng)求中Spring會(huì)創(chuàng)建一個(gè)實(shí)例,但是不同的請(qǐng)求會(huì)創(chuàng)建不同的實(shí)例。

1.2 基于xml中配置

1)四種自動(dòng)裝配類型

  • byName:根據(jù)名字自行自動(dòng)匹配。

  • byType:根據(jù)類型自行自動(dòng)匹配。

  • construtor:根據(jù)構(gòu)造函數(shù)自行自動(dòng)匹配。

  • autodetect:根據(jù)bean的自省機(jī)制選擇byType或者construtor。

2)Bean之間的關(guān)系

  • 繼承;
  • 依賴;
  • 引用。

1.3 基于注解的配置

1)使用注解定義bean

  • @Component:用于對(duì)所有的類進(jìn)行注解。
  • @Repository:用于對(duì)Dao實(shí)現(xiàn)類進(jìn)行標(biāo)注。
  • @Service:用于對(duì)Service實(shí)現(xiàn)類進(jìn)行標(biāo)注。
  • @controller:用于對(duì)controller實(shí)現(xiàn)類進(jìn)行標(biāo)注。

2)自動(dòng)裝配

  • @Autowired:通過(guò)@Autowired注解實(shí)現(xiàn)Bean的依賴注入。

  • @Autowired的required屬性:用來(lái)指定是否必須找到匹配的Bean。

  • @Qualifier,指定Bean的名稱。

profile:用于切換開(kāi)發(fā)環(huán)境。

Spring EL:更為靈活的注入方式,能夠在運(yùn)行時(shí)構(gòu)建復(fù)雜表達(dá)式,存取對(duì)象屬性、對(duì)象方法調(diào)用等。

作用

  • 使用bean id引用bean。

  • 調(diào)用指定對(duì)象的方法和訪問(wèn)對(duì)象的屬性。

  • 進(jìn)行運(yùn)算。

  • 提供正則表達(dá)式進(jìn)行匹配。

  • 集合配置。

二、面向切面編程(Aspect Oriented Programming)

概述:AOP技術(shù)利用"橫切"技術(shù),剖解開(kāi)封裝的對(duì)象內(nèi)部,并將那些影響了多個(gè)類的公共行為封裝到一個(gè)可重用模塊,并將其命名為"Aspect",即切面。所謂"切面",簡(jiǎn)單說(shuō)就是那些與業(yè)務(wù)無(wú)關(guān),卻為業(yè)務(wù)模塊所共同調(diào)用的邏輯或責(zé)任封裝起來(lái),便于減少系統(tǒng)的重復(fù)代碼,降低模塊之間的耦合度,并有利于未來(lái)的可操作性和可維護(hù)性。

2.1 AOP相關(guān)概念

方面(Aspect):一個(gè)關(guān)注點(diǎn)的模塊化,這個(gè)關(guān)注點(diǎn)實(shí)現(xiàn)可能另外橫切多個(gè)對(duì)象。事務(wù)管理是J2EE應(yīng)用中一個(gè)很好的橫切關(guān)注點(diǎn)例子。方面用Spring的 Advisor或攔截器實(shí)現(xiàn)。

連接點(diǎn)(Joinpoint): 程序執(zhí)行過(guò)程中明確的點(diǎn),如方法的調(diào)用或特定的異常被拋出。

通知(Advice): 在特定的連接點(diǎn),AOP框架執(zhí)行的動(dòng)作。各種類型的通知包括“around”、“before”和“throws”通知。通知類型將在下面討論。許多AOP框架包括Spring都是以攔截器做通知模型,維護(hù)一個(gè)“圍繞”連接點(diǎn)的攔截器鏈。Spring中定義了四個(gè)advice: BeforeAdvice, AfterAdvice, ThrowAdvice和DynamicIntroductionAdvice。

切入點(diǎn)(Pointcut): 指定一個(gè)通知將被引發(fā)的一系列連接點(diǎn)的集合。AOP框架必須允許開(kāi)發(fā)者指定切入點(diǎn):例如,使用正則表達(dá)式。 Spring定義了Pointcut接口,用來(lái)組合MethodMatcher和ClassFilter,可以通過(guò)名字很清楚的理解, MethodMatcher是用來(lái)檢查目標(biāo)類的方法是否可以被應(yīng)用此通知,而ClassFilter是用來(lái)檢查Pointcut是否應(yīng)該應(yīng)用到目標(biāo)類上。

引入(Introduction): 添加方法或字段到被通知的類。 Spring允許引入新的接口到任何被通知的對(duì)象。例如,你可以使用一個(gè)引入使任何對(duì)象實(shí)現(xiàn) IsModified接口,來(lái)簡(jiǎn)化緩存。Spring中要使用Introduction, 可有通過(guò)DelegatingIntroductionInterceptor來(lái)實(shí)現(xiàn)通知,通過(guò)DefaultIntroductionAdvisor來(lái)配置Advice和代理類要實(shí)現(xiàn)的接口。

目標(biāo)對(duì)象(Target Object): 包含連接點(diǎn)的對(duì)象。也被稱作被通知或被代理對(duì)象。POJO。

AOP代理(AOP Proxy): AOP框架創(chuàng)建的對(duì)象,包含通知。 在Spring中,AOP代理可以是JDK動(dòng)態(tài)代理或者CGLIB代理。

織入(Weaving): 組裝方面來(lái)創(chuàng)建一個(gè)被通知對(duì)象。這可以在編譯時(shí)完成(例如使用AspectJ編譯器),也可以在運(yùn)行時(shí)完成。Spring和其他純Java AOP框架一樣,在運(yùn)行時(shí)完成織入。

  • 前置通知(Before advice): 在某連接點(diǎn)(join point)之前執(zhí)行的通知,但這個(gè)通知不能阻止連接點(diǎn)前的執(zhí)行(除非它拋出一個(gè)異常)。

  • 后置通知(After advice): 當(dāng)某連接點(diǎn)退出的時(shí)候執(zhí)行的通知(不論是正常返回還是異常退出)。

  • 環(huán)繞通知(Around Advice): 包圍一個(gè)連接點(diǎn)(join point)的通知,如方法調(diào)用。這是最強(qiáng)大的一種通知類型。 環(huán)繞通知可以在方法調(diào)用前后完成自定義的行為。它也會(huì)選擇是否繼續(xù)執(zhí)行連接點(diǎn)或直接返回它們自己的返回值或拋出異常來(lái)結(jié)束執(zhí)行。

  • 返回后通知(After returning advice): 在某連接點(diǎn)(join point)正常完成后執(zhí)行的通知,例如,一個(gè)方法沒(méi)有拋出任何異常,正常返回。

  • 拋出異常后通知(After throwing advice): 在方法拋出異常退出時(shí)執(zhí)行的通知。

2.2 Spring AOP實(shí)現(xiàn)的四種方式:

  • 使用proxyFactoryBean和對(duì)應(yīng)的接口實(shí)現(xiàn)AOP

  • 使用XML配置AOP

  • 使用@AspectJ注解驅(qū)動(dòng)切面

  • 使用AspectJ注入切面

2.3 多切面的情況

  • aspect里面有一個(gè)order屬性,order屬性的數(shù)字就是橫切關(guān)注點(diǎn)的順序。

  • Spring默認(rèn)以aspect的定義順序作為織入順序。

三、Spring事務(wù)管理

3.1 事務(wù)管理器

Spring并不直接管理事務(wù),而是提供了多種事務(wù)管理器,他們將事務(wù)管理的職責(zé)委托給Hibernate或者JTA等持久化機(jī)制所提供的相關(guān)平臺(tái)框架的事務(wù)來(lái)實(shí)現(xiàn)。Spring事務(wù)管理器的接口是org.springframework.transaction.PlatformTransactionManager,通過(guò)這個(gè)接口,Spring為各個(gè)平臺(tái)如JDBC、Hibernate等都提供了對(duì)應(yīng)的事務(wù)管理器。

3.2 事務(wù)屬性的定義

1)傳播行為

Spring定義了七種傳播行為,以下為常見(jiàn)類型:

PROPAGATION_REQUIRED:表示當(dāng)前方法必須運(yùn)行在事務(wù)中。如果當(dāng)前事務(wù)存在,方法將會(huì)在該事務(wù)中運(yùn)行。否則,會(huì)啟動(dòng)一個(gè)新的事務(wù)

PROPAGATION_SUPPORTS:表示當(dāng)前方法不需要事務(wù)上下文,但是如果存在當(dāng)前事務(wù)的話,那么該方法會(huì)在這個(gè)事務(wù)中運(yùn)行

PROPAGATION_MANDATORY:表示該方法必須在事務(wù)中運(yùn)行,如果當(dāng)前事務(wù)不存在,則會(huì)拋出一個(gè)異常

2)隔離級(jí)別

隔離級(jí)別定義了一個(gè)事務(wù)可能受其他并發(fā)事務(wù)影響的程度。

  • ISOLATION_DEFAULT:使用后端數(shù)據(jù)庫(kù)默認(rèn)的隔離級(jí)別

  • ISOLATIONREADUNCOMMITTED:最低的隔離級(jí)別,允許讀取尚未提交的數(shù)據(jù)變更,可能會(huì)導(dǎo)致臟讀、幻讀或不可重復(fù)讀.

  • ISOLATIONREADCOMMITTED:允許讀取并發(fā)事務(wù)已經(jīng)提交的數(shù)據(jù),可以阻止臟讀,但是幻讀或不可重復(fù)讀仍有可能發(fā)生

  • ISOLATIONREPEATABLEREAD:對(duì)同一字段的多次讀取結(jié)果都是一致的,除非數(shù)據(jù)是被本身事務(wù)自己所修改,可以阻止臟讀和不可重復(fù)讀,但幻讀仍有可能發(fā)生

  • ISOLATION_SERIALIZABLE:最高的隔離級(jí)別,完全服從ACID的隔離級(jí)別,確保阻止臟讀、不可重復(fù)讀以及幻讀,也是最慢的事務(wù)隔離級(jí)別,因?yàn)樗ǔJ峭ㄟ^(guò)完全鎖定事務(wù)相關(guān)的數(shù)據(jù)庫(kù)表來(lái)實(shí)現(xiàn)的

3)只讀:通過(guò)將事務(wù)設(shè)置為只讀,你就可以給數(shù)據(jù)庫(kù)一個(gè)機(jī)會(huì),讓它應(yīng)用它認(rèn)為合適的優(yōu)化措施。

4)事務(wù)超時(shí):事務(wù)超時(shí)就是事務(wù)的一個(gè)定時(shí)器,在特定時(shí)間內(nèi)事務(wù)如果沒(méi)有執(zhí)行完畢,那么就會(huì)自動(dòng)回滾,而不是一直等待其結(jié)束。

5)回滾規(guī)則:這些規(guī)則定義了哪些異常會(huì)導(dǎo)致事務(wù)回滾而哪些不會(huì)。

3.3 編程式和聲明式事務(wù)的區(qū)別

Spring提供了對(duì)編程式事務(wù)和聲明式事務(wù)的支持,編程式事務(wù)允許用戶在代碼中精確定義事務(wù)的邊界,而聲明式事務(wù)(基于AOP)有助于用戶將操作與事務(wù)規(guī)則進(jìn)行解耦。

簡(jiǎn)單地說(shuō),編程式事務(wù)侵入到了業(yè)務(wù)代碼里面,但是提供了更加詳細(xì)的事務(wù)管理;而聲明式事務(wù)由于基于AOP,所以既能起到事務(wù)管理的作用,又可以不影響業(yè)務(wù)代碼的具體實(shí)現(xiàn)。

作者:姚遠(yuǎn)

來(lái)源:宜信技術(shù)學(xué)院

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

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

AI