??
默認的情況下,Aspect類只有一個實例存在于虛擬機中,也就是作為單例存在的,對于每個對象來說,方面是共享的。一般這樣的方面,不能用來保存相應對象的狀態(tài)。
?? 對于AspectJ 來說,Aspect方面類,包括以下的實例化方式。
- 每虛擬機(默認),只有一個實例,其生命周期從虛擬機啟動開始,一直到虛擬機停止。
- 每對象,對于每一個對象都有一個方面實例,其生命周期跟隨相關聯(lián)的對象。
- 每控制流,對于每個controlFlow點,都會創(chuàng)建相應的方面實例,可以參考事務管理(對于事務,每個原子操作,都是一個控制流,方面的生命周期,從控制流開始,一直到控制流結束)。
1)?? 每虛擬機關聯(lián)
默認方面,它的狀態(tài)是共享的。
2)每對象關聯(lián)
通常,重用基礎方面需要保持每個對象的狀態(tài),也就是對象的數據。對于每個對象都會創(chuàng)建一個方面實例。
對于每對象關聯(lián)可以指定兩種類型:perthis()-與當前所匹配的連接點的執(zhí)行對象,所關聯(lián)
pertarget()—與當前所匹配的連接點的目標執(zhí)行對象,所關聯(lián)
3)每控制流關聯(lián)
可以指定兩種類型的每控制流對象關聯(lián):
percflow()--對于在percflow()指定的pointcut所匹配的連接點,關聯(lián)每一個獨立的方面實例和控制流執(zhí)行。
percflowbelow(),對于在prcflowbelow ()指定的pointcut所匹配的連接點,關聯(lián)每一個獨立的方面實例和控制流下的執(zhí)行。
下面來看一個實例:來區(qū)別不同點:
聲明必要的測試類
|
public class TestBean {
??? private String name;
??? public TestBean(String name) { ??????? this.name = name; ??? }
??? public void method1() { ??? }
??? public void method2() { ??? }
??? @Override ??? public String toString() { ??????? return name; ??? }
}
測試類: public class LogAspectTest {
??? @Test ??? public void testAssociation() { ??????? TestBean bean1 = new TestBean("bean1"); ??????? TestBean bean2 = new TestBean("bean2"); ??????? bean1.method1(); ??????? bean1.method2(); ??????? bean2.method1(); ??????? bean2.method2(); ??? } }
方面類: public aspect LogAspect {
??? private static Log log = LogFactory.getLog(LogAspect.class);
??? public LogAspect() { ??????? log.info("create LogAspect instance"); ??? }
??? pointcut logMethod(TestBean bean) ??????? :execution(* TestBean.method*(..))&&this(bean)&&!within(LogAspect+);
??? before(TestBean bean):logMethod( bean){ ??????? log.info("JoinPoint: " ???????????????? + thisJoinPointStaticPart ???????????????? + "\n\taspect: " ???????????????? + this ???????????????? + "\n\tobject: " ???????????????? + bean);
??? } }
|
|
默認的輸出為:
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
可以看到只是實例化了一次
現(xiàn)在更改相應的aspect,
public aspect LogAspect
perthis(logMethod(TestBean)){
??? ....
??? }
}
只是增加了perthis(logMethod(TestBean))
輸出時,可以看到創(chuàng)建了兩個實例
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
繼續(xù)更改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
每個方法都創(chuàng)建相應的實例。
posted on 2006-10-21 20:50
布衣郎 閱讀(1982)
評論(0) 編輯 收藏 所屬分類:
aop