7

カスタムアノテーションでタグ付けされたメソッドをインターセプトしようとしていますが、これを読んだ理由は、それを機能させることができないためです。私は簡単な例に従ってきましたが、それを機能させることができません。

これが私のコードです。

MyAnnotation.java:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MyAnnotation {
  String value() default "";
  String key() default "";
  String condition() default "";
}

MyAspect.java:

@Aspect
public class MyAspect {

  @Pointcut(value="execution(public * *(..))")
  public void anyPublicMethod() { }

  @Around("anyPublicMethod() && @annotation(myAnnotation)")
  public Object process(ProceedingJoinPoint jointPoint, MyAnnotation myAnnotation) throws Throwable {
    System.out.println("In AOP process");
    return 5; //jointPoint.proceed();
  }
}

spring-config.xml:

<beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:mvc="http://www.springframework.org/schema/mvc"
           xmlns:c="http://www.springframework.org/schema/c"
           xmlns:context="http://www.springframework.org/schema/context"
           xmlns:tx="http://www.springframework.org/schema/tx"
           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:cache="http://www.springframework.org/schema/cache"
           xmlns:task="http://www.springframework.org/schema/task"
           xsi:schemaLocation="
           http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
           http://www.springframework.org/schema/mvc
           http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-3.2.xsd
           http://www.springframework.org/schema/tx
           http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
           http://www.springframework.org/schema/aop 
           http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
           http://www.springframework.org/schema/cache 
           http://www.springframework.org/schema/cache/spring-cache-3.2.xsd
           http://www.springframework.org/schema/task
           http://www.springframework.org/schema/task/spring-task-3.2.xsd">


    ...

  <context:component-scan base-package="com.myapp">
    <context:include-filter type="annotation" expression="org.aspectj.lang.annotation.Aspect"/>
  </context:component-scan>


  <aop:aspectj-autoproxy proxy-target-class="true" />
  <bean id="myAspect" class="com.myapp.annotation.MyAspect" />

    ...

MyComponent.java:

@Component
public class MyComponent {
  @MyAnnotation(value="valtest", key="keytest", condition="contest")
  public int add(int i, int j) {
    System.out.println("Executing annotation.add");
    return i+j;
  }
}

テストコード:

final MyComponent m = new MyComponent();
assertTrue(5 == m.add(0, 1)); // Here m.add(...) always returns 1 instead of 5.

補足として、私はポイントカットをさまざまな方法で定義しようとしましたが、すべてanyPublic()メソッドとその実行ポイントカットを使用する場合と使用しない場合がありますが、どれもうまくいきませんでした。

  1. @Around("@annotation(com.myapp.annotation.MyAnnotation)") public Object process(ProceedingJoinPoint jointPoint) throws Throwable { .. }

  2. @Around(value="@annotation(myAnnotation)", argNames="myAnnotation") public Object process(ProceedingJoinPoint jointPoint, MyAnnotation myAnnotation) throws Throwable { .. }

  3. @Around("execution(* com.myapp.*.*(..)) && @annotation(com.myapp.annotation.MyAnnotation)") public Object process(ProceedingJoinPoint jointPoint) throws Throwable { .. }

私は何が間違っているのですか?

4

1 に答える 1

9

テストコードでは、Springにを作成することを許可していませんがMyComponent、代わりにnew演算子を使用しています。MyComponentSpringからアクセスする必要がありますApplicationContext

public class SomeTest {
    public static void main(String[] args) throws Exception {
        final ApplicationContext appContext = new ClassPathXmlApplicationContext("spring-config.xml");
        final MyComponent myComponent = appContext.getBean(MyComponent.class);
        //your test here...
    }
}

Springからコンポーネントを取得しない場合、どのようにプロキシされると思いますか?

于 2013-02-05T18:16:33.353 に答える