Spring_AOP_基本概念和xml配置
AOP是什麼?
Aspect Oriented Programming,即面向切面程式設計。
AOP把軟體系統分為兩個部分:核心關注點和橫切關注點。
業務處理的主要流程是核心關注點,與之關係不大的部分是橫切關注點。
橫切關注點的一個特點是,他們經常發生在核心關注點的多處,而各處基本相似,比如許可權認證、日誌、事務。
AOP的作用在於分離系統中的各種關注點,將核心關注點和橫切關注點分離開來。
一些虛擬碼
public class AccountServiceImpl implements IAccountService{ public void transfer(BigDecimal value){ try{ // 開啟事務 // 轉賬操作 // 提交事務 }catch(Exception e){ // 回滾事務 }finally{ // 關閉資源 } } }
其中轉賬操作就可以視為核心關注點,事務相關的、關閉資源操作就可以視為橫切關注點。
· AOP的目的
AOP能夠將那些與業務無關,卻為業務模組所共同呼叫的邏輯或責任(例如事務處理、日誌管理、許可權控制等)封裝起來,
便於減少系統的重複程式碼,降低模組間的耦合度,並有利於未來的可拓展性和可維護性。
· AOP的實現
Spring的AOP使用了動態代理實現。
如果一個類實現了介面,那麼spring就使用JDK的動態代理完成AOP;
如果一個類沒有實現介面,那麼spring就使用cglib完成AOP。
· 一些概念
Aspect
切面。對橫切關注點的抽象。
做什麼增強?
日誌?事務?許可權認證?what?
Pointcut
切入點。
在哪裡切入?
哪些類?哪些方法?where?
Adivice
增強,通知。
在什麼時候切入?
方法前?方法後?方法前後?when?
Weaving
織入。把切面加入到物件,並創建出代理物件的過程。
該過程由Spring來完成。
AOP的使用
· 切入點語法
AspectJ語言,由AOP聯盟制定規範。
語法 :execution(<修飾符>? <返回型別> <宣告型別>? <方法名>(<引數>) <異常>?)
如execution(* com.hanaii.pss.service.*Service.*(..))表示:
插入點為com.hanaii.pss.service包下,以Service結尾的類的方法。
· 依賴的jar包
spring-aop-*.jar
com.springsource.org.aopalliance-*.jar
com.springsource.org.aspectj.weaver-*.jar
· 名稱空間的配置
· xml配置
對下例配置檔案進行解釋:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
">
<!-- 配置註解解析器 -->
<context:annotation-config />
<!-- 配置bean -->
<bean id="accountService" class="com.hanaii.aop.AccountServiceImpl"/>
<bean id="txManager" class="com.hanaii.aop.TransactionManager"/>
<!-- aop相關配置 -->
<aop:config>
<!-- what: 做什麼增強 -->
<aop:aspect ref="txManager" >
<!-- where: 在哪裡增強 -->
<aop:pointcut expression="execution(* com.hanaii.aop.*Service.*(..))" id="txPointcut"/>
<!-- when: 什麼時候增強 -->
<aop:before method="begin" pointcut-ref="txPointcut"/>
<aop:after-returning method="commit" pointcut-ref="txPointcut"/>
<aop:after-throwing method="rollback" pointcut-ref="txPointcut"/>
</aop:aspect>
</aop:config>
</beans>
<aop:config>
在該標籤中,進行aop相關的配置
<aop:aspect>
配置切面。
其ref屬性值為增強類的bean id。
在該標籤中,對該增強類進行Pointcut和Advice的配置
<aop:pointcut>
配置切入點。
其expression屬性值為切入點位置(AspectJ語言)。id屬性值為該切入點的id。
Advice配置相關
增強的型別
配置相關部分標籤如上文配置檔案。
其pointcut-ref屬性值為切入點id。
· 增強型別之環繞增強 Around Advice
最強大的一種增強型別。
環繞增強可以在方法呼叫前後完成自定義的行為。
環繞通知有兩個要求:
1、方法必須要返回一個Object(返回的結果)
2、方法的第一個引數必須是ProceedingJoinPoint(可以繼續向下傳遞的切入點)
ProceedingJoinPoint介面繼承於JoinPoint介面
其proceed方法的作用是讓目標方法執行。
JoinPoint
連線點
每個方法的前、後(兩者都有也行),或丟擲異常是時都可以是連線點。
spring只支援方法連線點。其他如AspectJ還可以讓你在構造器或屬性注入時都行。
我們在想做增強的連線點,就是切入點(Ponitcut)。