閑人野居
          好好學習,天天向上
          posts - 57,  comments - 137,  trackbacks - 0
          ?? 默認的情況下,Aspect類只有一個實例存在于虛擬機中,也就是作為單例存在的,對于每個對象來說,方面是共享的。一般這樣的方面,不能用來保存相應對象的狀態。
          ?? 對于AspectJ 來說,Aspect方面類,包括以下的實例化方式。
          • 每虛擬機(默認),只有一個實例,其生命周期從虛擬機啟動開始,一直到虛擬機停止。
          • 每對象,對于每一個對象都有一個方面實例,其生命周期跟隨相關聯的對象。
          • 每控制流,對于每個controlFlow點,都會創建相應的方面實例,可以參考事務管理(對于事務,每個原子操作,都是一個控制流,方面的生命周期,從控制流開始,一直到控制流結束)。

          1)?? 每虛擬機關聯

          默認方面,它的狀態是共享的。

          2)每對象關聯

          通常,重用基礎方面需要保持每個對象的狀態,也就是對象的數據。對于每個對象都會創建一個方面實例。

          對于每對象關聯可以指定兩種類型:

          perthis()-與當前所匹配的連接點的執行對象,所關聯

          pertarget()—與當前所匹配的連接點的目標執行對象,所關聯

          3)控制流關聯

          可以指定兩種類型的每控制流對象關聯:

          percflow()--對于在percflow()指定的pointcut所匹配的連接點,關聯每一個獨立的方面實例和控制流執行。

          percflowbelow(),對于在prcflowbelow ()指定的pointcut所匹配的連接點,關聯每一個獨立的方面實例和控制流下的執行。


          下面來看一個實例:來區別不同點:

          聲明必要的測試類



          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

          可以看到只是實例化了一次


          現在更改相應的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


          每個方法都創建相應的實例。


          posted on 2006-10-21 20:50 布衣郎 閱讀(1989) 評論(0)  編輯  收藏 所屬分類: aop

          <2006年10月>
          24252627282930
          1234567
          891011121314
          15161718192021
          22232425262728
          2930311234

          常用鏈接

          留言簿(12)

          隨筆分類(59)

          隨筆檔案(57)

          blog

          java

          uml

          搜索

          •  

          積分與排名

          • 積分 - 358032
          • 排名 - 156

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 太原市| 辽阳县| 太仆寺旗| 广平县| 望都县| 诸暨市| 区。| 长兴县| 古丈县| 侯马市| 昆明市| 鄂尔多斯市| 四平市| 武功县| 和龙市| 正安县| 开江县| 临潭县| 明星| 中超| 志丹县| 柳江县| 淮南市| 肇东市| 卢湾区| 观塘区| 沐川县| 庐江县| 曲沃县| 河源市| 绥滨县| 乳源| 新丰县| 尼勒克县| 招远市| 南江县| 台东县| 永康市| 乐至县| 永昌县| 斗六市|