春に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つの些細なことを確認したいと思います。
このメソッドが静的でない場合、doAfter()でsecondMethod()を呼び出すにはどうすればよいですか?SimpleClassのインスタンスの一種がSimpleAspectである必要がありますか?そのようなインスタンスを提供する方法は?
最初の質問とほぼ同じですが、secondMethod()がfirstMethod()と同じクラスにない場合はどうなりますか?