0

Spring (2.5) で AspectJ (1.6) をいじっているだけですが、適切に動作していないようです。以下を使用して「beans.xml」をセットアップしました。

<aop:aspectj-autoproxy/>
<bean id="testBean1" class="apackage.MyClass">
<bean id="aopBean1" class="apackage.AfterReturningExample"/>

正しい名前空間が設定され、他のいくつかの Bean は重要ではありません。単純な Bean を使用してアドバイスをテストします。

package apackage;

        @Aspect
        public class MyClass {

            public MyClass()
            {

            }
                public Boolean testAspectJ()
                {
                        System.out.println("returning from MyClass.testAspectJ()");
                        return false;
                }
        }

そして、これは aop Bean です。

package apackage;    
@Aspect 
    public class AfterReturningExample {
        public AfterReturningExample(){}
        @AfterReturning("execution(* apackage.MyClass.*(..))")
        public void test() throws Exception{

            System.err.println("\n\n####  After Returning MyClass.testAspectJ()\n\n");
        }
    }

最後に、これはテスト コードです (メイン メソッド内)。

ApplicationContext ctx = new ClassPathXmlApplicationContext("apackage/beans.xml"); 
MyClass bean = (MyClass) ctx.getBean("testBean1"); 
bean.testAspectJ();

出力は以下のみを印刷します。

returning from MyClass.testAspectJ()

奇妙なことに、ポイントカットに使用すると:

"execution(public * *(..))"

ログには、AfterReturningExample クラスの System.out.println が表示されます。私は何が欠けていますか?

4

1 に答える 1

0

解決策が見つかりました!まず、MyClassはアスペクトではないため、@Aspectアノテーションは必要ありません。次に、MyClassは特定の Interface ( MyClassInterfaceと言う) の実装である必要があり、テスト コードでは を使用することをお勧めしますMyClassInterface bean = (MyClassInterface) ctx.getBean("testBean1");。追加したbeans.xml<aop:aspectj-autoproxy proxy-target-class="true"/>にクラスパスにCGLIBライブラリが ある場合にのみ、インターフェイスではなくクラスプロキシを使用できます。

于 2010-09-19T23:00:12.860 に答える