Java AspectJ@Before注释问题

Java AspectJ@Before注释问题,java,spring,aspectj,spring-aop,Java,Spring,Aspectj,Spring Aop,我在AspectJ实现方面遇到了一些问题 我想为带有@MyAnnotation的方法创建一个log方法 MyAnnotation.java: @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface MyAnnotation{ } MyAspect.java: @Aspect public class MyAspect { private static Logger logger

我在AspectJ实现方面遇到了一些问题
我想为带有@MyAnnotation的方法创建一个log方法

MyAnnotation.java:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MyAnnotation{ }
MyAspect.java:

@Aspect
public class MyAspect {
    private static Logger logger = Logger.getLogger(MyAspect.class.getName());

    @Pointcut("@annotation(com.utils.aop.annotations.MyAnnotation)")
    public void logMyAspect() {
    }
    @Before("logMyAspect()")
    public void logMethod(JoinPoint jp) {
        String methodName = jp.getSignature().getName();
        logger.info("Executing method: " + methodName);
    }
}
我在使用我的@MyAnnotation之前使用了我项目的一些服务方法:

    @RolesAllowed({ "DEV", "GUI", "API" })
    @POST
    @Path("/getList")
    @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
    @MyAnnotation
    public Response getList(@Context final ContainerRequestContext requestContext,  
            FilterAndSortObject filterAndSortObject, 
            @QueryParam("offset") final int offset,
            @QueryParam("limit") final int limit)
    {
             ...
    }
我还看到,我应该在我的配置类中使用@enableAspectProxy:

@Configuration
@EnableAspectJAutoProxy
public class ServletContextClass implements ServletContextListener {
    final static Logger logger = Logger.getLogger(ServletContextClass.class);
    @Override
    public void contextInitialized(final ServletContextEvent sce) {
    ...
    }
...
}
然而,它似乎不起作用。它没有记录任何东西
我在
日志方法(JoinPoint jp)
中使用了一个断点,并检查了结果,但没有成功


有人知道为什么这不起作用吗?

您不必将切入点和处理程序方法分开;事实上,我相信这就是你的问题所在。以下方面应该可以很好地发挥作用:

@Aspect
public class MyAspect {
    private static Logger logger = Logger.getLogger(MyAspect.class.getName());
    @Before("@annotation(com.utils.aop.annotations.MyAnnotation)")
    public void logMyAspect(JoinPoint jp) {
        String methodName = jp.getSignature().getName();
        logger.info("Executing method: " + methodName);
    }
}
如果注释值包含参数,也可以检查注释值:

@Before("@annotation(a)")
public void logMyAspect(JoinPoint jp, MyAnnotation a) {
    // conditional logging based on annotation contents
}

我使用了单独的切入点和处理程序来解决这个问题,这并不是他遇到任何问题的根本原因。@RoddyoffFrozenpeas这实际上是他和(工作)方面的唯一区别我在我的项目中使用的一个不是问题。也许这会有所帮助:并且请确保在其中注释方法的类也是Spring组件。这在春季AOP中很容易被忘记。这在AspectJ中是不必要的,但SpringAOP只适用于Spring管理的bean。