連接點 JointPoint
表示需要在程序中插入橫切關(guān)注點的擴展點,連接點可能是類初
始化、方法執(zhí)行、方法調(diào)用、字段調(diào)用或處理異常等等,Spring
只支持方法執(zhí)行連接點
切入點 Pointcut
選擇一組相關(guān)連接點的模式,即可以認為連接點的集合,Spring
支持perl5正則表達式和AspectJ切入點模式,Spring默認使用
AspectJ語法
通知 Advice
在連接點上執(zhí)行的行為,通知提供了在AOP中需要在切入點所選
擇的連接點處進行擴展現(xiàn)有行為的手段;在Spring中通過代理模
式實現(xiàn)AOP
方面/切面 Aspect
橫切關(guān)注點的模塊化,比如上邊提到的日志組件??梢哉J為是通知、引入和切入點的組合;在Spring中可以使用Schema和@AspectJ方式進行組織實現(xiàn)。
目標(biāo)對象 Target Object
需要被織入橫切關(guān)注點的對象,即該對象是切入點選擇的對象,需
要被通知的對象,從而也可稱為“被通知對象”;由于Spring
AOP 通過代理模式實現(xiàn),從而這個對象永遠是被代理對象。
AOP代理 AOP Proxy
AOP框架使用代理模式創(chuàng)建的對象,從而實現(xiàn)在連接點處插入通
知(即應(yīng)用切面),就是通過代理來對目標(biāo)對象應(yīng)用切面。在
Spring中,AOP代理可以用JDK動態(tài)代理或CGLIB代理實現(xiàn),而通
過攔截器模型應(yīng)用切面。
織入 Weaving
織入是一個過程,是將切面應(yīng)用到目標(biāo)對象從而創(chuàng)建出AOP代理對象的過程,織入可以在編譯期、類裝載期、運行期進行。
前置通知 Before Advice
在切入點選擇的連接點處的方法之前執(zhí)行的通知,該通知不影響正常程序執(zhí)行流程。
后置通知 After Advice
? 在切入點選擇的連接點處的方法之后執(zhí)行的通知
? 后置返回通知(After returning Advice)
? 后置異常通知(After throwing Advice)
? 后置最終通知(After finally Advice)
環(huán)繞通知 Around Advice
? 環(huán)繞著在切入點選擇的連接點處的方法所執(zhí)行的通知


定義切入點,就是執(zhí)行的條件。切入點的方法不用任何代碼,返回值是void,最重要的是執(zhí)行的條件的表達式。
@Pointcut("execution(* com.test.service.*.*(..))")
public void executeService()
{
}
1)execution:用于匹配子表達式。
//匹配com.cjm.model包及其子包中所有類中的所有方法,返回類型任意,方法參數(shù)任意
@Pointcut("execution(* com.cjm.model..*.*(..))")
public void before(){}
2)within:用于匹配連接點所在的Java類或者包。
//匹配Person類中的所有方法
@Pointcut("within(com.cjm.model.Person)")
public void before(){}
//匹配com.cjm包及其子包中所有類中的所有方法
@Pointcut("within(com.cjm..*)")
public void before(){}
3) this:用于向通知方法中傳入代理對象的引用。
@Before("before() && this(proxy)")
public void beforeAdvide(JoinPoint point, Object proxy){
//處理邏輯
}
4)target:用于向通知方法中傳入目標(biāo)對象的引用。
@Before("before() && target(target)
public void beforeAdvide(JoinPoint point, Object proxy){
//處理邏輯
}
5)args:用于將參數(shù)傳入到通知方法中。
@Before("before() && args(age,username)")
public void beforeAdvide(JoinPoint point, int age, String username){
//處理邏輯
}
6)@within :用于匹配在類一級使用了參數(shù)確定的注解的類,其所有方法都將被匹配。
@Pointcut("@within(com.cjm.annotation.AdviceAnnotation)") - 所有被@AdviceAnnotation標(biāo)注的類都將匹配
public void before(){}
7)@target :和@within的功能類似,但必須要指定注解接口的保留策略為RUNTIME。
@Pointcut("@target(com.cjm.annotation.AdviceAnnotation)")
public void before(){}
8)@args :傳入連接點的對象對應(yīng)的Java類必須被@args指定的Annotation注解標(biāo)注。
@Before("@args(com.cjm.annotation.AdviceAnnotation)")
public void beforeAdvide(JoinPoint point){
//處理邏輯
}
9)@annotation :匹配連接點被它參數(shù)指定的Annotation注解的方法。也就是說,所有被指定注解標(biāo)注的方法都將匹配。
@Pointcut("@annotation(com.cjm.annotation.AdviceAnnotation)")
public void before(){}
10)bean:通過受管Bean的名字來限定連接點所在的Bean。該關(guān)鍵詞是Spring2.5新增的。
@Pointcut("bean(person)")
public void before(){}


請注意我們使用了“&&”操作符把execution()和within()指示器連接在一起形成與(and)關(guān)系(切點必須匹配所有的指示器)。類似地,我們可以使用“||”操作符來標(biāo)識或(or)關(guān)系,而使用“!”操
作符來標(biāo)識非(not)操作。
因為“&”在XML中有特殊含義,所以在Spring的XML配置里面描述切點時,我們可以使用and來代替“&&”。同樣,or和not可以分別用來代替“||”和“!”。
通知參數(shù)
任何通知方法可以將第一個參數(shù)定義為org.aspectj.lang.JoinPoint類型(環(huán)繞通知需要定義第一個參數(shù)為ProceedingJoinPoint類型,它是 JoinPoint 的一個子類)。JoinPoint接口提供了一系列有用的方法,比如 getArgs()(返回方法參數(shù))、getThis()(返回代理對象)、getTarget()(返回目標(biāo))、getSignature()(返回正在被通知的方法相關(guān)信息)和 toString()(打印出正在被通知的方法的有用信息)
切入點表達式
定義切入點時需要一個包含名字和任意參數(shù)的簽名,還有一個切入點表達式,就是* findById*(..)這一部分。
切入點表達式的格式:execution([可見性] 返回類型 [聲明類型].方法名(參數(shù)) [異常])
其中【】中的為可選,其他的還支持通配符的使用:
*:匹配所有字符
..:一般用于匹配多個包,多個參數(shù)
+:表示類及其子類
運算符有:&&、||、!
在使用spring框架配置AOP的時候,不管是通過XML配置文件還是注解的方式都需要定義pointcut”切入點”
例如定義切入點表達式 execution (* com.sample.service.impl..*. *(..))
execution()是最常用的切點函數(shù),其語法如下所示:
整個表達式可以分為五個部分:
1、execution(): 表達式主體。
2、第一個*號:表示返回類型, *號表示所有的類型。
3、包名:表示需要攔截的包名,后面的兩個句點表示當(dāng)前包和當(dāng)前包的所有子包,com.sample.service.impl包、子孫包下所有類的方法。
4、第二個*號:表示類名,*號表示所有的類。
5、*(..):最后這個星號表示方法名,*號表示所有的方法,后面括弧里面表示方法的參數(shù),兩個句點表示任何參數(shù)
相關(guān)博客:
http://www.cnblogs.com/lic309/p/4079194.html
http://blog.csdn.net/lk7688535/article/details/51989746