2011-12-06 4 views
1

ServiceFactoryBeanで作成された(ServiceLoaderがロードされた)Beanにaspectを適用する際に問題があります。ServiceFactoryBeanで作成したBeanにSpringのアスペクトが適用されていません

私の春のコンテキストは次のようなものになります。

... 
<aop:aspectj-autoproxy/> 

<bean id="myBean" 
     class="org.springframework.beans.factory.serviceloader.ServiceFactoryBean" 
     p:serviceType="com.test.MyInterface"/> 

<bean id="myAnotherBean" 
     class="com.test.MyAnotherBean"/> 

を次のように私の側面が定義されている。いくつかの未知の理由

@Aspect 
public class MyAspect { 

    @Pointcut("bean(myBean)") 
    public void foo() { 
    } 

    @Pointcut("bean(myAnotherBean)") 
    public void bar() { 
    } 

    @Around("foo()") 
    public Object doFoo(final ProceedingJoinPoint jp) throws Throwable { 
     return timed(jp, "foo"); 
    } 

    @Around("bar()") 
    public Object doBar(final ProceedingJoinPoint jp) throws Throwable { 
     return timed(jp, "bar"); 
    } 

    private ThreadLocal<StopWatch> stopWatch = new ThreadLocal<StopWatch>(); 

    private Object timed(final ProceedingJoinPoint jp, final String taskName) throws Throwable { 
     stopWatch.get().add(taskName); 
     try { 
      return jp.proceed(); 
     } finally { 
      if (stopWatch.get() != null) { 
       stopWatch.get().stop(taskName); 
      } 
     } 
    } 
} 

を、側面にのみmyAnotherBeanの呼び出しではなくにMyBeanとする者に適用されますコール。 アイデア

+1

myBeanへの呼び出しに自己呼び出しが推奨されていませんか? – smp7d

答えて

0

smp7dがあなたの質問のコメントに示唆しているように、Springが作成したプロキシは、メソッド呼び出しが別のオブジェクトから来ている場合にのみ、アドバイスを適用できます。自己呼び出しではアドバイスを起動するには不十分です。

http://static.springsource.org/spring/docs/3.0.0.M3/spring-framework-reference/html/ch08s06.html

public class Main { 

    public static void main(String[] args) { 

     ProxyFactory factory = new ProxyFactory(new SimplePojo()); 
     factory.addInterface(Pojo.class); 
     factory.addAdvice(new RetryAdvice()); 

     Pojo pojo = (Pojo) factory.getProxy(); 

     // this is a method call on the proxy! 
     pojo.foo(); 
    } 
} 

ここを理解するために重要なことは、メインクラスの(..)メイン内部クライアントコードは、プロキシへの参照を持っているということです。つまり、そのオブジェクト参照のメソッド呼び出しはプロキシの呼び出しとなり、プロキシは特定のメソッド呼び出しに関連するすべてのインターセプタ(アドバイス)に委譲できます。しかし、呼び出しが最終的にターゲットオブジェクト、この場合SimplePojo参照に到達すると、this.bar()やthis.foo()などのそれ自体で行うことができるメソッド呼び出しは、この参照であり、プロキシではありません。これには重要な意味があります。つまり、自己呼び出しは、メソッド呼び出しに関連するアドバイスが実行される機会を得ることにつながりません。

関連する問題