spring框架複習--aop,事務

AOP概述

1.AOP爲Aspect Oriented Programming的縮寫,意爲:面向切面編程,通過預編譯方式和運行期動態代理實現程序功能的統一維護的一種技術。
2. 利用AOP可以對業務邏輯的各個部分進行隔離,從而使得業務邏輯各部分之間的耦合度降低,提高程序的可重用性,同時提高了開發的效率。
3.AOP採取橫向抽取機制,取代了傳統縱向繼承體系重複性代碼
經典應用:事務管理、性能監視、安全檢查、緩存 、日誌等
4.AspectJ是一個基於Java語言的AOP框架,Spring2.0開始,Spring AOP引入對Aspect的支持,AspectJ擴展了Java語言,提供了一個專門的編譯器,在編譯時提供橫向代碼的織入

AOP實現原理

a. aop底層將採用代理機制進行實現。
b. 接口 + 實現類 :spring採用 jdk 的動態代理Proxy。
c. 實現類:spring 採用 cglib字節碼增強。

補充(資料來源黑馬)

在這裏插入圖片描述

補充(資料來源:六月的餘暉博客)

1)Java SE動態代理:
使用動態代理可以爲一個或多個接口在運行期動態生成實現對象,生成的對象中實現接口的方法時可以添加增強代碼,從而實現AOP。缺點是隻能針對接口進行代理,另外由於動態代理是通過反射實現的,有時可能要考慮反射調用的開銷。
(2)字節碼生成(CGLib 動態代理)
動態字節碼生成技術是指在運行時動態生成指定類的一個子類對象,並覆蓋其中特定方法,覆蓋方法時可以添加增強代碼,從而實現AOP。其常用工具是cglib。
(3)定製的類加載器
當需要對類的所有對象都添加增強,動態代理和字節碼生成本質上都需要動態構造代理對象,即最終被增強的對象是由AOP框架生成,不是開發者new出來的。解決的辦法就是實現自定義的類加載器,在一個類被加載時對其進行增強。JBoss就是採用這種方式實現AOP功能。
(4)代碼生成
利用工具在已有代碼基礎上生成新的代碼,其中可以添加任何橫切代碼來實現AOP。
(5)語言擴展
可以對構造方法和屬性的賦值操作進行增強,AspectJ是採用這種方式實現AOP的一個常見Java語言擴展。

個人理解

要增強的類有接口底層就用jdk動態代理,沒有接口就用cglib代理(肯定有誤,看下面有具體解釋)
代碼舉例:

jdk代理:
在這裏插入圖片描述

寫一個增強類()
前後增強實現兩個接口(增強那個寫那個)
在這裏插入圖片描述
 環繞增強類需要實現 org.aopalliance.intercept.MethodInterceptor 接口(相當於同時實現前後增強)
在這裏插入圖片描述
測試:
在這裏插入圖片描述
這裏沒有用spring管理bean

使用spring

在這裏插入圖片描述
相應類上加上註解 掃描

在這裏插入圖片描述
結果同上

個人理解:
1.getbean(“greetingProxy”)獲得的其實也是一個代理 然後強轉成我要的類型
2.以上細心的童鞋會發現以上全是對類中某一個方法的增強,如果想對類新增一個方法如何做到.

引入增強

對方法的增強叫做織入 對類的增強叫做引入增強

問題引入 :上面寫的類是實現的greeting接口,如果要新增方法的話必須實現接口的方法.這時就需要改類代碼了.
而cglib代理的話,不需要實現接口,意思其實是再寫一個接口上面寫上你的增強方法,再讓增強類實現接口,原來的類不用改動只需改配置就可以了(可能存在的誤區:cglib也能增強方法)
在這裏插入圖片描述
在這裏插入圖片描述
(糾正:應該是是否啓用代理類,啓用代理類就是啓用cglib,而jdk代理是代理的接口)
在這裏插入圖片描述
代理的是類所以上面用的是impl 要使用新增方法只需強轉接口就可以了

題外:(資料來源黑馬 更詳細的介紹)
在這裏插入圖片描述

aop術語

1.target:目標類,需要被代理的類。例如:UserService
2.Joinpoint(連接點):所謂連接點是指那些可能被攔截到的方法。例如:所有的方法
3.PointCut 切入點:已經被增強的連接點。例如:addUser()
4.advice 通知/增強,增強代碼。例如:after、before
5. Weaving(織入):是指把增強advice應用到目標對象target來創建新的代理對象proxy的過程.
6.proxy 代理類
7. Aspect(切面): 是切入點pointcut和通知advice的結合
一個線是一個特殊的面。
一個切入點和一個通知,組成成一個特殊的面。

springaop 全自動編程

上面的例子全是半自動的,將代理交給spring來創建

全自動spring配置(看註釋理解)在這裏插入圖片描述
 AspectJ是一個基於Java語言的AOP框架
 Spring2.0以後新增了對AspectJ切點表達式支持
建議用aspectj

切入點表達式

語法:execution(修飾符 返回值 包.類.方法名(參數) throws異常)

修飾符,一般省略
public 公共方法
* 任意
返回值,不能省略
void 返回沒有值
String 返回值字符串
* 任意
包,[省略]
com.gyf.crm 固定包
com.gyf.crm..service crm包下面子包任意 (例如:com.gyf.crm.staff.service)
com.gyf.crm… crm包下面的所有子包(含自己)
com.gyf.crm.
.service… crm包下面任意子包,固定目錄service,service目錄任意包
類,[省略]
UserServiceImpl 指定類
Impl 以Impl結尾
User
以User開頭
* 任意
方法名,不能省略
addUser 固定方法
add* 以add開頭
*Do 以Do結尾
* 任意
(參數)
() 無參
(int) 一個整型
(int ,int) 兩個
(…) 參數任意
throws ,可省略,一般不寫。

案例1:
execution(* com.gyf.crm..service….*(…))

案例2:或
<aop:pointcut expression=“execution(* com.gyf.crm.service..(…)) ||
execution(* com.gyf.Do.(…))” id=“myPointCut”/>
within:
匹配包或子包中的方法(瞭解)
within(com.gyf.aop…*)

this:
匹配實現接口的代理對象中的方法(瞭解)
this(com.gyf.aop.user.UserDAO)

target:
匹配實現接口的目標對象中的方法(瞭解)
target(com.gyf.aop.user.UserDAO)
args:
匹配參數格式符合標準的方法(瞭解)
args(int,int)
bean(id)
對指定的bean所有的方法(瞭解)
bean(‘userServiceId’)

使用註解配置切面類

在這裏插入圖片描述
///未完待續

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