??
默認(rèn)的情況下,Aspect類只有一個(gè)實(shí)例存在于虛擬機(jī)中,也就是作為單例存在的,對(duì)于每個(gè)對(duì)象來(lái)說(shuō),方面是共享的。一般這樣的方面,不能用來(lái)保存相應(yīng)對(duì)象的狀態(tài)。
?? 對(duì)于AspectJ 來(lái)說(shuō),Aspect方面類,包括以下的實(shí)例化方式。
- 每虛擬機(jī)(默認(rèn)),只有一個(gè)實(shí)例,其生命周期從虛擬機(jī)啟動(dòng)開始,一直到虛擬機(jī)停止。
- 每對(duì)象,對(duì)于每一個(gè)對(duì)象都有一個(gè)方面實(shí)例,其生命周期跟隨相關(guān)聯(lián)的對(duì)象。
- 每控制流,對(duì)于每個(gè)controlFlow點(diǎn),都會(huì)創(chuàng)建相應(yīng)的方面實(shí)例,可以參考事務(wù)管理(對(duì)于事務(wù),每個(gè)原子操作,都是一個(gè)控制流,方面的生命周期,從控制流開始,一直到控制流結(jié)束)。
1)?? 每虛擬機(jī)關(guān)聯(lián)
默認(rèn)方面,它的狀態(tài)是共享的。
2)每對(duì)象關(guān)聯(lián)
通常,重用基礎(chǔ)方面需要保持每個(gè)對(duì)象的狀態(tài),也就是對(duì)象的數(shù)據(jù)。對(duì)于每個(gè)對(duì)象都會(huì)創(chuàng)建一個(gè)方面實(shí)例。
對(duì)于每對(duì)象關(guān)聯(lián)可以指定兩種類型:perthis()-與當(dāng)前所匹配的連接點(diǎn)的執(zhí)行對(duì)象,所關(guān)聯(lián)
pertarget()—與當(dāng)前所匹配的連接點(diǎn)的目標(biāo)執(zhí)行對(duì)象,所關(guān)聯(lián)
3)每控制流關(guān)聯(lián)
可以指定兩種類型的每控制流對(duì)象關(guān)聯(lián):
percflow()--對(duì)于在percflow()指定的pointcut所匹配的連接點(diǎn),關(guān)聯(lián)每一個(gè)獨(dú)立的方面實(shí)例和控制流執(zhí)行。
percflowbelow(),對(duì)于在prcflowbelow ()指定的pointcut所匹配的連接點(diǎn),關(guān)聯(lián)每一個(gè)獨(dú)立的方面實(shí)例和控制流下的執(zhí)行。
下面來(lái)看一個(gè)實(shí)例:來(lái)區(qū)別不同點(diǎn):
聲明必要的測(cè)試類
|
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; ??? }
}
測(cè)試類: 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);
??? } }
|
|
默認(rèn)的輸出為:
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
可以看到只是實(shí)例化了一次
現(xiàn)在更改相應(yīng)的aspect,
public aspect LogAspect
perthis(logMethod(TestBean)){
??? ....
??? }
}
只是增加了perthis(logMethod(TestBean))
輸出時(shí),可以看到創(chuàng)建了兩個(gè)實(shí)例
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
每個(gè)方法都創(chuàng)建相應(yīng)的實(shí)例。
posted on 2006-10-21 20:50
布衣郎 閱讀(1989)
評(píng)論(0) 編輯 收藏 所屬分類:
aop