閑人野居
          好好學習,天天向上
          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

          搜索

          •  

          積分與排名

          • 積分 - 358033
          • 排名 - 156

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 枣庄市| 塘沽区| 八宿县| 静乐县| 临桂县| 舒兰市| 凤台县| 娱乐| 南和县| 陆川县| 盐池县| 昌图县| 泗水县| 蒲城县| 平利县| 安福县| 惠安县| 资溪县| 凤台县| 红桥区| 临洮县| 喜德县| 永胜县| 临安市| 图木舒克市| 淮南市| 安远县| 宁蒗| 灵川县| 清苑县| 富阳市| 资源县| 玉田县| 民权县| 旬阳县| 都安| 贵溪市| 定南县| 新田县| 普安县| 措美县|