Spring中提供兩種AOP支持:
1.基於代理的經典AOP
2.Aspectj注解配置AOP
首先我們先了解什么是AOP,AOP(Aspect Oriented Programming)面向切面編程!AOP采用了橫向抽取機制(可能有人會說啥叫橫向抽取機制,在這里先引入一個縱向繼承的概念),取代了縱向繼承的重復性代碼(例如權限控制、性能監視、緩存)
spring AOP使用純Java實現,主要通過代理方式向目標類(被代理的類織入增強代碼)
Aspectj 是一個基於Java語言的AOP框架
縱向繼承:
在圖中,左邊的傳統的縱向繼承方式,因為writelog在具體實現類userdao中無法被復用,所以此方法就被放到了所有的dao的父類BaseDao中
多態的特性,所有子類dao要加強代碼時,經過父類的writelog方法,類似一種從上到下的關系;然而右邊的是AOP思想下的代碼增強,因為不
論是代理類UserDaoProxy,還是被代理類UserDao,都實現了同一個接口或是同一個父類,屬於兄弟關系,實現了所謂的“橫向”的切入機制!
而對於AOP中的一些術語,我覺得你們需要了解一下,以便於對下面的閱讀有幫助!
針對這個圖再補充一下,一個切點和一個advice的組合叫advisor!!
(1) 基於代理的經典AOP
通知:advice
Spring提供了 前置通知、環繞通知、后置通知、異常通知等等。
這些advice分別對應要實現的接口:MethodBeforeAdvice、MethodInteceptor、AfterReturningAdvice、ThrowsAdvice
就拿前置通知來舉例子:
這是在xml中的各個類的配置
但其實你們會發現,我這里的advice沒有指定要對哪個方法執行增強,因為dao可能會有好幾種方法,但是有些並不需要增強,所以一,我們就需要一個帶有特定切點的advice!
基於以上的配置進行修改,帶有切點的切面!!
一個切點和一個advice的組合:advisor
帶有切點的切面,只需要在以上配置中再加一個:
之后在配置代理類時,把interceptorname換位這個帶有切點的切面id
但是有沒有發現前面的配置中,每一步生成代理類時,都需要主動去配置proxyFactoryBean來生成代理類,這樣做很麻煩,所以這里又要引入自動代理的概念!!
(2) Aspectj配置AOP(推薦使用)
2.1基於Aspectj注解形式
第一步:引入相應的jar包
第二步:以Aspectj形式編寫
第三步:創建xml文檔:
2.2基於Aspectj的xml形式配置
這是以xml形式編寫的aspect配置