1

Aspect を Spring 3 とアノテーションで動作させようとしています。

@Aspect
public class AttributeAspect {

  @Pointcut("@annotation(com.mak.selective.annotation.Attribute)")
  public void process(){
    System.out.println("Inside Process ....");
  }

  @Around("process()")
  public void processAttribute(){
    System.out.println("Inside Actual Aspect ..");
  }
}

XML:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:util="http://www.springframework.org/schema/util"
xmlns:context="http://www.springframework.org/schema/context"
 xsi:schemaLocation="http://www.springframework.org/schema/beans                 http://www.springframework.org/schema/beans/spring-beans.xsd       http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">
 <aop:aspectj-autoproxy proxy-target-class="false" />
<context:component-scan base-package="com.mak.selective.annotation.*" />
<bean name="attribute" class="com.mak.selective.annotation.AttributeAspect"/>
</beans>

アスペクトをテストするMYテスト:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("/springcontext/*.xml")
public class AttributeTest {

@Attribute(tableName = "firstTable", columnName = "New Column")
private void getAttribute() {
    System.out.println("Inside Attribute call...");
}

@Test
public void testAttributeAspect() {
    getAttribute();
}

}

このコードでは、「Inside Attribute call ...」のみが表示されますが、アスペクトからは何も表示されません。ガイドしてください。

新しいオブジェクト (コンポーネント) を作成し、Junit テスト クラスに注入することで、これを機能させました。

4

3 に答える 3

1

XML から機能するようになったのは良いことですが、注釈からも機能する可能性があります。

問題は、@Aspectアノテーションが Spring ステレオタイプではないため、スキャナーがアスペクトを Spring Bean として登録していないことです。上か下かどちら@Serviceかを追加するだけで登録されます。@Component@Aspect

また、 Spring の標準設計に従って、Bean に直接名前を付ける (例: @Service("myNamedService")) か、インターフェースを実装する (例: )。public class AttributeAspect implements IAspect {

于 2011-09-21T14:23:23.920 に答える
0

いくつかのこと:

まず、アドバイスを回避するときは、次のようなアドバイス方法を作成する必要があります。

@Around(...)
public void aroundAdviceMethod(ProceedingJoinPoint pjp) throws Throwable {
    try {
        System.out.println("before...");
        pjp.proceed();
    }
    finally {
        System.out.println("After...");
    }
}

しかしまた(そしてこれは少なくともプロキシを使用している場合に当てはまりますが、あなたの場合は完全にはわかりません)、アドバイスを提供する方法は公開(あなたの場合はそうではありません)、春の管理(@Componentなどを介して)である必要があります)そして、プロキシが有効になるようにクラスから外部に呼び出されます(この例ではそうではありません)。したがって、次のようなものが必要です。

@Component
public class SomeClass {
    @Attribute
    public void someMethodCall() {
        System.out.println("In method call");
    }
}

public class SomeUnitTest {
    @Autowired SomeClass someClass;
    @Test 
    public void testAspect() {
        someClass.someMethodCall();
    }
}
于 2011-09-21T13:53:30.987 に答える
0

メソッドが呼び出された同じ Bean フォーム内でメソッドの呼び出しをインターセプトする場合は、実際の AspectJ を使用する必要があります。(あなたが行ったことは、メソッド testAttributeAspect() が他の Bean にある場合に機能するはずです。)


実際の AspectJ を行うには?

AspectJ コンパイラーとウィーバーを使用すると、完全な AspectJ 言語を使用できます。これについては、セクション7.8「Spring アプリケーションでの AspectJ の使用」で説明しています。

@Springリファレンスを参照

于 2011-09-21T13:52:18.587 に答える