1. 程式人生 > >Spring AOP的八個概念、五個通知型別、AOP的第一種實現方式

Spring AOP的八個概念、五個通知型別、AOP的第一種實現方式

CRUD:增刪改查

平安校園的系統開發記錄

裝置管理、平安校園、會員註冊三個模組

問題提出:如何統計統計模組的使用頻率?

如何統計各個模組中的各個功能的使頻率

問題提出方案:日誌統計分析--- ---------------------人員ID IP  操作時間模組 功能

實現原理與實現過程:程式碼的侵入式、Filter:過濾器加入一個攔截器:Interceptor(類似過濾器)設定攔截規則,然後加日誌AOP在OOP的基礎上的建立的。

AOP是OOP的延續,是(Aspect Oriented Programming)的縮寫,意思是
1、主要的功能是:日誌記錄,效能統計,安全控制,事務處理,異常處理、許可權登入、手機端的新聞客戶端推薦新聞等等。

2、主要的意圖是:將日誌記錄,效能統計,安全控制,事務處理,異常處理等程式碼從業務邏輯程式碼中劃分出來,通過對這些行為的分離,我們希望可以將它們獨立的裴指導業務邏輯的方法中,進而改變這些行為的時候不影響業務邏輯的程式碼。

3、相對於OOP的程式設計思想的優點:程式非侵入式\避免程式碼冗餘量大

實現步驟:

<?xml version="1.0" encoding="UTF-8"?>
 <beans xmlns="http://www.springframework.org/schema/beans" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation=
" http://www.springframework.org/schema/beans
 http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/aop 
http://www.springframework.org/schema/aop/spring-aop-4.2.xsd">

<!-- 邏輯層實現類 -->
<bean id="aopService" class="com.javalxj.spring.aop.service.impl.AopServiceImpl">
<property name="aopDao" ref="aopDao"></property>
</bean>
<!-- 資料層實現類 -->
<bean id="aopDao" class="com.javalxj.spring.aop.dao.impl.AopDaoImpl">
</bean>
<!-- 日誌通知實現類 -->
<bean id="loggerAdvice" class="com.javalxj.spring.aop.advice.LoggerAdvice">
</bean>
<!-- AOP代理 配置-->
<aop:config>
<aop:aspect ref="loggerAdvice">
<aop:pointcut expression="execution(*//*方法的返回型別   com.javalxj.spring.aop.service.impl.AopServiceImpl.*//任意方法(String,String))" id="method"/>
<aop:after pointcut-ref="method" method="addLog"/>
</aop:aspect>
<!--Caused by: java.lang.ClassNotFoundException: org.aopalliance.intercept.MethodInterceptor匯入架包  -->
</aop:config>
</beans>

兩個引用的XML檔案配置:<aop:config>
<aop:aspect ref="loggerAdvice">

<aop:pointcut expression="execution(* com.javalxj.spring.*.service.impl.*ServiceImpl.*(String,String))" id="method"/>
<aop:after pointcut-ref="method" method="addLog"/>
</aop:aspect>
</aop:config>

引數不同

<aop:aspect ref="loggerAdvice">
<aop:pointcut expression="execution(* com.javalxj.spring.*.service.impl.*mpl.*(String,*))" id="method"/>
<aop:after pointcut-ref="method" method="addLog"/>
</aop:aspect>

中間路徑層次不同可以用../任意的層級路徑代替但是在專案中很少這樣寫,因為效率低

4、Spring AOP的八個概念:

  1. 連線點:在程式執行中特定的方法eg:需要繫結日誌:create
  2. 切入點--站在應用程式角度思考:由連線點組成的集合:    eg:多個模組的所有的create方法
  3. 關注點--站在開發者角度思考:其實就是連線點:程式設計師所關心的共性的功能:方法執行的過程中是否能夠繫結日誌
  4. 切面:由多個切入點所構成的集合aop:aspect
  5. 目標物件:aopservice/iocservice:包含連線點的物件
  6. 通       知:關注點的實現
  7. AOP代理:宣告動態的把通知所實現的功能回帖(create and addLog)到目標物件上
  8. 織        入:實現AOP代理所宣告的功能
5、Spring AOP的五個通知型別:----決定何時觸發通知
  1. after:後置通知----不論攔截的方法是否有異常
  2. before:前置通知
  3. around:環繞通知---需要放行操作
  4. after-returning:後置成功通知---------攔截的方法沒油丟擲異常就會執行--攔截到的方法必須正確返回;
  5. after-throwing:後置異常通知----攔截的方法如果丟擲異常則會執行----有異常執行它沒油異常不執行
AOP的提出者: jboss公司:around

多數監控異常通知----同時繫結郵箱

around:實現其他四種功能

<aop:config>
<aop:aspect ref="loggerAdvice">
<aop:pointcut expression="execution(* com.javalxj.spring.*.service..*mpl.*(String,*))" id="method"/>
<aop:around pointcut-ref="method" method="around"/>
</aop:aspect>
<!--Caused by: java.lang.ClassNotFoundException: org.aopalliance.intercept.MethodInterceptor匯入架包  -->
</aop:config>

public class LoggerAdvice {


public void around(ProceedingJoinPoint pjp){
System.out.println("around前置通知");
try{
System.out.println("around後置成功通知");
}
catch(Throwable e){
System.out.println("around後置異常通知");
}finally{
System.out.println("around後置通知");
}
}
public void addLog(){
System.out.println("日誌實現攔截到該方法日誌實現");
}
}