aop是面向方面的程式設計,在實際開發中,aop都會工作在業務層,因為業務層要呼叫資料層,而業務層也要完成所有輔助性的業務層操作。
packagecom.spring.service;
import
com.spring.vo.member;
public
inte***ce
imemberservice
package此時的業務層只關興核心的業務功能,核心的功能就是呼叫了業務層**。com.spring.service.impl;
import
org.springframework.stereotype.service;
import
com.spring.service.imemberservice;
import
com.spring.vo.member;
@service
public
class imemberserviceimpl implements
imemberservice
}
隨後所有的輔助性操作功能,都通過spring容器,動態配置。
base-package:表示掃瞄com.spring開頭的包以下的檔案,配合@service註解,這個包以下的相關類會自動配置,代替一般的bean配置。
可以複習:
測試**:
package輸出結果:com.spring.test;
import
import
import
com.spring.service.imemberservice;
import
com.spring.service.impl.memberserviceimpl;
import
com.spring.vo.member;
public
class
testmemberservice
}
但是這種操作並不嚴格,還需要準備相應的輔助性功能,那麼這些輔助性的功能,可以單獨定義在乙個切面處理的類之中。
這裡的切面類也用@
package預設情況下spring不會開啟切面。引入aop命名空間。com.spring.aop;
import
org.springframework.stereotype.component;
@component
public
class
serviceaspect
public
void
serviceafter()
}
勾選上:
**中多了這些:
下面在xml檔案中配置檔案組織切面。
重新執行最開始的test類,發現報錯:
bean named 'memberserviceimpl' must be of type [com.spring.service.impl.memberserviceimpl], but was actually of type [com.sun.proxy.$proxy8]網上查詢得知:
使用了jdk的自動動態**,需要在
執行後結果:
此時的業務層裡面還沒有出現任何的與業務層的核心操作有關的**。而所有的輔助功能都會以切面的形式出現在專案的執行過程之中,而
這些切面就是最早的**類。
步驟:1,首先需要定義乙個切面aop:pointcut ,裡面包含這個切面所覆蓋的位置,由表示式expression決定,然後還需要乙個id值。
2,然後定義乙個面向方面的處理類;aop:aspect,裡面需要指定這個類的例項是哪個,上面用ref和annotation配置組合確定了。
3,分別指定由aop:aspect指定的處理類的aop:before,aop,after等方法,裡面需要指定這個方法關聯哪個切面,通過pointcut-ref指定切面,然後就會對該切面所
覆蓋指定的類的物件,進行切面處理了,比如每次相關類例項物件呼叫方法的時候,aop:befer等方法也會被呼叫。
分析結果:
這裡切面和我們的service類關聯起來的地方就是定義切面處的 expression="execution(* com.spring..*.*(..)))" 。
只要符合這個表示式的類,這裡就是這個包下面的類,的物件例項執行,在執行前和執行後都會呼叫切面類裡面的方法,具體呼叫哪個方法
,有aop:before,或者aop:*** 絕對。
整個配置過程中,其基本的操作意義基本一看明白,但是最重要的是切入點的設定。
execution(* com.spring..*.*(..)))這種語法就是aspectj定義的切入點操作語法。此語法結構如下:
excution(修飾符匹配? 返回值型別 操作型別的匹配? 名稱匹配(引數匹配) 丟擲異常匹配)以上語法詳細解釋如下:這裡的?表示乙個或0個。
1,修飾符:public private ,只能出現0次或1次,(本次沒有出現,預設public)
2,返回值:execution(*com.spring..*.*(..)))。如果使用的是*,表示返回任意型別。
3,名稱匹配:execution(*com.spring..*.*(..))),表示的是具體要使用的此切面的程式類,如果寫的是com.spring表示這個包中的,
而如果出現「..」,則表示在任意子包下,隨後的*.*表示任意類的任意方法,第乙個*表示類名稱,第二個表示方法名稱。
4,方法引數:execution(* com.spring..*.*(..))),使用「..」表示使用任意多個引數,如果使用的是「*」,表示匹配任意乙個引數。
比如execution(* com.spring..*.*(..)))就表示:在com.spring這個包下,任意返回值的任意類的,任意方法中,任意引數的地方,都要執行這個切面的攔截。
一旦攔截成功,就觸發相應的處理方法,讓我們的切面執行。
Spring學習日記(一)AOP的初步實現
工具 myeclipse 1 新建乙個web project 2 匯入spring開發包 專案檔案 右鍵 configure facets install spring facets 3 配置annotaion 4 配置aop 開啟aop命名空間 1 定義業務層操作介面 定義業務層介面 public...
spring學習初步
package cn.bupt.duming.service public inte ce greetingservice 儘管看起來,在此處沒必要隱藏介面,但是我們還是建議將實現與介面分離。public class greetingserviceimpl implements greetingse...
黃曉童SPRING學習筆記 對AOP的初步理解
spring的定義 對di的初步理解 對aop的初步理解 對di的深入 對aop的深入 spring的事務管理 spring mvc 接下來闡述一下我對aop的理解,還是回到之前那個騎士和尋找聖杯的場景來。現在場景稍有改變,在騎士尋找聖杯的時候,要有乙個詩人陪伴他,以朗誦詩歌的形式為他 按照以往的方...