AspectJ注释切入点不被隐藏(对于任何注释类型)

时间:2014-12-01 09:14:14

标签: java spring annotations aop aspectj

我已经经历了很多stackoverflow问题和AspectJ docs,并且在我的实现中必定存在一些微不足道的错误,因为我还没有发现任何涉及示例和文档的危险信号。

目标

定义一个自定义注释,作为方法调用的切入点(如果语义不在这里,请道歉,我希望这些示例有帮助)。

代码

请注意我已经更改了一些类名,使它们听起来很通用。

package com.example.so;

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;

import java.util.HashSet;

@Aspect
public class CustomAspect {

    private final HashSet<String> instanceProperty;

    public CustomAspect(final HashSet<String> constructorArgument) {
        this.instanceProperty = constructorArgument;
    }

   /* @Around("execution(* com.example.so.IService..*(..))")
    public void beforeTransactionalMethod(ProceedingJoinPoint pjp) throws Throwable {

        System.log.println("execution point-cut");
        pjp.proceed();
    }*/

    // @Before("@annotation(java.lang.Override)")
    @Before("@annotation(com.example.so.Custom)")
    public void around() throws Throwable {

        System.out.println("annotation");

    }
}

方面界面:

package com.example.so;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Custom{

}

Spring配置

<aop:aspectj-autoproxy />

    <bean id="customAspect" class="com.example.so.CustomAspect">
        <constructor-arg ref="arg"/>
    </bean>

使用方面:

(...)
    @Override
    @Custom
    public void saveData(final Object data) {

      // this is being called

    }
(...)

POM,以防万一(版本1.6.11):

   <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjrt</artifactId>
    </dependency>
    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjweaver</artifactId>
    </dependency>

行为

如果我删除评论:

/* @Around("execution(* com.example.so.IService..*(..))")
    public void beforeTransactionalMethod(ProceedingJoinPoint pjp) throws Throwable {

        System.log.println("execution point-cut");
        pjp.proceed();
    }*/

这会被调用,但无论我做什么,我都无法使用我的自定义注释或其他方式调用注释切入点(这可能很愚蠢,但无论如何我都试过了):

    //@Before("@annotation(java.lang.Override)")
    @Before("@annotation(com.example.so.Custom)")
    public void around() throws Throwable {

        System.out.println("annotation");

    }

有没有人有任何想法,我相信所有的配置都在那里,因为CustomAspect在上下文中并且是活动的。我之前添加了组件标签,但我将其删除了,因为我认为在这种情况下它们没有意义。

提前谢谢。

0 个答案:

没有答案