?? 對于AspectJ 來說,Aspect方面類,包括以下的實例化方式。
- 每虛擬機(默認),只有一個實例,其生命周期從虛擬機啟動開始,一直到虛擬機停止。
- 每對象,對于每一個對象都有一個方面實例,其生命周期跟隨相關聯的對象。
- 每控制流,對于每個controlFlow點,都會創建相應的方面實例,可以參考事務管理(對于事務,每個原子操作,都是一個控制流,方面的生命周期,從控制流開始,一直到控制流結束)。
1)?? 每虛擬機關聯
默認方面,它的狀態是共享的。
2)每對象關聯
通常,重用基礎方面需要保持每個對象的狀態,也就是對象的數據。對于每個對象都會創建一個方面實例。對于每對象關聯可以指定兩種類型:
perthis()-與當前所匹配的連接點的執行對象,所關聯
pertarget()—與當前所匹配的連接點的目標執行對象,所關聯
3)每控制流關聯
可以指定兩種類型的每控制流對象關聯:
percflow()--對于在percflow()指定的pointcut所匹配的連接點,關聯每一個獨立的方面實例和控制流執行。
percflowbelow(),對于在prcflowbelow ()指定的pointcut所匹配的連接點,關聯每一個獨立的方面實例和控制流下的執行。
下面來看一個實例:來區別不同點:
聲明必要的測試類
|
默認的輸出為:
2006-10-21 20:42:02,275 [demo.chap4.log.LogAspect] - create LogAspect instance
2006-10-21 20:42:02,275 [demo.chap4.log.LogAspect] - JoinPoint: execution(void demo.chap4.log.TestBean.method1())
??? aspect: demo.chap4.log.LogAspect@15601ea
??? object: bean1
2006-10-21 20:42:02,275 [demo.chap4.log.LogAspect] - JoinPoint: execution(void demo.chap4.log.TestBean.method2())
??? aspect: demo.chap4.log.LogAspect@15601ea
??? object: bean1
2006-10-21 20:42:02,275 [demo.chap4.log.LogAspect] - JoinPoint: execution(void demo.chap4.log.TestBean.method1())
??? aspect: demo.chap4.log.LogAspect@15601ea
??? object: bean2
2006-10-21 20:42:02,275 [demo.chap4.log.LogAspect] - JoinPoint: execution(void demo.chap4.log.TestBean.method2())
??? aspect: demo.chap4.log.LogAspect@15601ea
??? object: bean2
可以看到只是實例化了一次
現在更改相應的aspect,
public aspect LogAspect perthis(logMethod(TestBean)){
??? ....
??? }
}
只是增加了perthis(logMethod(TestBean))
輸出時,可以看到創建了兩個實例
2006-10-21 20:45:21,306 [demo.chap4.log.LogAspect] - create LogAspect instance
2006-10-21 20:45:21,306 [demo.chap4.log.LogAspect] - JoinPoint: execution(void demo.chap4.log.TestBean.method1())
??? aspect: demo.chap4.log.LogAspect@197d257
??? object: bean1
2006-10-21 20:45:21,306 [demo.chap4.log.LogAspect] - JoinPoint: execution(void demo.chap4.log.TestBean.method2())
??? aspect: demo.chap4.log.LogAspect@197d257
??? object: bean1
2006-10-21 20:45:21,306 [demo.chap4.log.LogAspect] - create LogAspect instance
2006-10-21 20:45:21,306 [demo.chap4.log.LogAspect] - JoinPoint: execution(void demo.chap4.log.TestBean.method1())
??? aspect: demo.chap4.log.LogAspect@7259da
??? object: bean2
2006-10-21 20:45:21,306 [demo.chap4.log.LogAspect] - JoinPoint: execution(void demo.chap4.log.TestBean.method2())
??? aspect: demo.chap4.log.LogAspect@7259da
??? object: bean2
繼續更改aspect,把perthis改為percflow
輸出改為:
2006-10-21 20:46:58,009 [demo.chap4.log.LogAspect] - create LogAspect instance
2006-10-21 20:46:58,009 [demo.chap4.log.LogAspect] - JoinPoint: execution(void demo.chap4.log.TestBean.method1())
??? aspect: demo.chap4.log.LogAspect@eee36c
??? object: bean1
2006-10-21 20:46:58,009 [demo.chap4.log.LogAspect] - create LogAspect instance
2006-10-21 20:46:58,009 [demo.chap4.log.LogAspect] - JoinPoint: execution(void demo.chap4.log.TestBean.method2())
??? aspect: demo.chap4.log.LogAspect@194df86
??? object: bean1
2006-10-21 20:46:58,009 [demo.chap4.log.LogAspect] - create LogAspect instance
2006-10-21 20:46:58,009 [demo.chap4.log.LogAspect] - JoinPoint: execution(void demo.chap4.log.TestBean.method1())
??? aspect: demo.chap4.log.LogAspect@defa1a
??? object: bean2
2006-10-21 20:46:58,009 [demo.chap4.log.LogAspect] - create LogAspect instance
2006-10-21 20:46:58,009 [demo.chap4.log.LogAspect] - JoinPoint: execution(void demo.chap4.log.TestBean.method2())
??? aspect: demo.chap4.log.LogAspect@f5da06
??? object: bean2
每個方法都創建相應的實例。