国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發(fā)設(shè)計 > 正文

JBOSSAOP學習筆記-標簽使用(J2SE5.0)中的元數(shù)據(jù)

2019-11-18 16:22:42
字體:
供稿:網(wǎng)友
方法和注釋
要把你的java代碼和AOP結(jié)合起來,可以使用一些標簽,就像新的JDK5.0版本中的元數(shù)據(jù)以及XDoclet 。對于你的JAVA方法,就有點像使用synchronized一樣。當你把你的方法標注為synchronized,就表明 你高數(shù)JVM你的這個方法在執(zhí)行的使用是需要同步的。注釋標簽允許你定義新的關(guān)鍵詞用來處理你自己 的特殊行為。AOP就使你有了把這些織入到你的應(yīng)用中,以使應(yīng)用可以執(zhí)行的能力。

讓我們看看我們使用自己定義的標簽@Oneway來使一個方法在后臺的另外一個線程執(zhí)行。

import org.jboss.aspects.Oneway;

public class Foo
{
   @Oneway public static void someMethod() {...}

   public static void main(String[] args)
   {
      someMethod(); // executes in background
   }
}


當我們的MAIN方法調(diào)用 Msomeethod方法的時候,起始它的執(zhí)行是和MAIN方法平行的另外一個同步方法中執(zhí)行。要執(zhí)行這個類,我們必須首先定義自己的標簽到JAVA語法中。

 package org.jboss.aspects;

import java.lang.annotation.ElementType;
import java.lang.annotation.Target;

@Target({ElementType.METHOD})
public @interface Oneway {}


這就夠了。@Target可以限制你的標簽的應(yīng)用范圍。在這里你的Oneway就只能被用于方法。上面這些是純粹的J2SE5.0里面應(yīng)用。

下面的是我們的方面,用來執(zhí)行@Oneway的行為。

package org.jboss.aspects;

public OnewayAspect
{
   PRivate static class Task implements Runnable
   {
      private MethodInvocation invocation;

      public Task(MethodInvocation invocation)
      {
        this.invocation = invocation;
      }
      public void run()
      {
        try { invocation.invokeNext(); }
        catch (Throwable ignore) { }
      }
   }

   public Object oneway(MethodInvocation invocation) throws Throwable
   {
      MethodInvocation copy = invocation.copy();
      Thread t = new Thread(new Task(copy));
      t.setDaemon(false);
      t.start();
      return null;
   }
}


我們的方面就是這么簡單。
最后就是我們要定義切入點

<aop>
   <aspect class="org.jboss.aspects.OnewayAspect"/>

   <bind pointcut="execution(void *->@org.jboss.Oneway(..))">
      <advice name="oneway"
              aspect="org.jboss.aspects.OnewayAspect"/>
   </bind>
</aop>


這個定義表明了只有是void的被標注為@Oneway的方法才被我們OnewayAspect執(zhí)行。
這樣就可以把你
其它應(yīng)用加上去,這就是簡單,清晰,方便的JAVA預(yù)言。

字段和注釋
通過AOP我們也可以定義我們自己的字段意思,例如我們可以定義一個ThreadLocal的字段,如果
使用以前的方法,我們就必須使用很多GET()和SET()才能實現(xiàn)。而現(xiàn)在我們可以直接定義一個
@ThreadLocal的類型。

要使用這個新的類型可以像這樣:
import org.jboss.aspects.Threadbased;

public class Foo
{
   @Threadbased private int counter;
}


首先我們要定義這個類型
package org.jboss.aspects;

import java.lang.annotation.ElementType;
import java.lang.annotation.Target;

@Target({ElementType.FIELD})
public @interface Threadbased {}


這樣就可以了,現(xiàn)在所有被標注為@Threadbased的字段都將被應(yīng)用到這里來,但這里限制了此類型
只能用戶字段。

下面就是實現(xiàn)我們的方面來做具體的工作。

package org.jboss.aspects;

import org.jboss.aop.joinpoint.*;
import java.lang.reflect.Field;

public class ThreadbasedAspect
{
   private ThreadLocal threadbased = new ThreadLocal();

   public Object access(FieldReadInvocation invocation)
       throws Throwable
   {
      // just in case we have a primitive,
      // we can't return null
      if (threadbased.get() == null)
          return invocation.invokeNext();
      return threadbased.get();
   }

   public Object access(FieldWriteInvocation invocation)
       throws Throwable
   {
      threadbased.set(invocation.getValue());
      return null;
   }
}

最后定義切入點
<aop>
   <aspect class="org.jboss.aspects.ThreadbasedAspect"
           scope="PER_JOINPOINT"/>
   <bind pointcut="field(* *->@org.jboss.aspects.Threadbased)">
      <advice name="access"
              aspect="org.jboss.aspects.ThreadbasedAspect"/>
   </bind>
</aop>


我們的希望是為每個字段都進行實例化的時候使之成為一個Threadlocal的靜態(tài)變量,所以在定義切入點的時候我們使用了PER_JOINPOINT,讓JBOSS AOP知道為我們每個字段都要實例化一個新的ThreadLocal,否則JBOSS AOP只會我們實例化一個ThreadbasedAspect,如果這樣就會讓所有的字段共享一個Threadlocal,這明顯不是我們所期望的。

和上面一樣,在這里我們看到了干凈的,容易集成的方法實現(xiàn)了定義新的JAVA類型。

(出處:http://m.survivalescaperooms.com)



發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 曲周县| 阿图什市| 安图县| 内丘县| 察隅县| 岳池县| 荥经县| 酉阳| 和田市| 潞西市| 筠连县| 海安县| 江川县| 永年县| 右玉县| 洛阳市| 霍林郭勒市| 兴海县| 黄梅县| 瑞昌市| 鹤峰县| 莱州市| 吉林省| 舞钢市| 菏泽市| 政和县| 乐清市| 阿勒泰市| 鹤庆县| 陇南市| 黄骅市| 绥阳县| 霍城县| 大安市| 辰溪县| 理塘县| 西宁市| 赤峰市| 遵化市| 宁德市| 抚顺市|