2

春にAspectJを使う方法を学び始めています。次のクラスがあります。新しいスレッド(長時間実行タスク)で最初のメソッドを実行したいので、これはAspectを使用して実現できると思いました-firstMethodが呼び出されると、Aspectはこの呼び出しを新しいスレッドに自動的に委任します。firstMethodが終了した後、firstMethod値によって返される引数としてsecondMethodを呼び出す必要があります。

public class SimpleClass{
    public Object firstMethod(){
        //some operations
        return object;
    }
    public void secondMethod(Object returnedObjectByFirstMethod){
    }
}

@Aspect
public class SimpleAspect {

   @Around("execution(* SimpleClass.firstMethod(..))")
   public void doInNewThread(final ProceedingJoinPoint joinPoint) throws Throwable {
       Thread t = new Thread(new Runnable() {
           public void run() { 
               joinPoint.proceed();
           }
       });
       t.start();
   }

   @AfterReturning(
      pointcut = "execution(* SimpleClass.firstMethod(..))",
      returning= "result")
   public void doAfter(JoinPoint joinPoint, Object result) {
       SimpleClass.secondMethod(result);
   }
}

これは一種のプロトタイプであり、まだ実装していません。そのようには機能しないと確信していますが、2つの些細なことを確認したいと思います。

  1. このメソッドが静的でない場合、doAfter()でsecondMethod()を呼び出すにはどうすればよいですか?SimpleClassのインスタンスの一種がSimpleAspectである必要がありますか?そのようなインスタンスを提供する方法は?

  2. 最初の質問とほぼ同じですが、secondMethod()がfirstMethod()と同じクラスにない場合はどうなりますか?

4

0 に答える 0