仅在使用 AspectJ 的注释方法上应用方面(没有 Spring)

Apply aspect only on annotated methods using AspectJ(without Spring)

我想在有一些资源限制的 Java 中使用方面,所以我不能使用 Spring 方面,因为它占用大量内存。

所以我想在没有 Spring 的情况下做的是创建一个自定义注释,这将触发注释方法的一个方面。

我有一些实现,但我看不到方法运行时触发的 Apect。这是我的:

我的自定义注释

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

注释使用的地方

@MyCustomAnnotation
     public void someMethod() {
        System.out.println("Method runnning...");
     }

我创建的方面

@Aspect
public class MyAspect {

    @Pointcut("execution(* *(..))")
    public void callAt() {}

    @Around(("callAt()"))
    public void doSomething(ProceedingJoinPoint point)  {
      point.proceed();
      System.out.println("Aspect is runnning...");
}

我的 gradle 文件中的配置

dependencies {
        classpath "gradle.plugin.aspectj:gradle-aspectj:0.1.6"
    }

apply plugin: 'aspectj-gradle'

    compile 'org.aspectj:aspectjrt:1.9.1'
    compile 'org.aspectj:aspectjweaver:1.9.1'

我不知道为什么它没有被触发,当应用程序运行时,我在控制台中看不到来自该方面的消息。 知道我错过了什么吗?

方面与您的注释无关,但我知道您首先尝试了最简单的切入点。

作为您的周围建议 returns void,它只能拦截也 returning void 的方法。可能你正试图拦截其他 return 类型的方法,不过,我只能推测,因为你没有共享你的目标代码。确保周围建议 returns Object (或任何 return 类型你的目标方法)和 proceed() 的结果是由建议 return 编辑的。

顺便说一句,你决定不使用 Spring 只是因为它的 "AOP lite" 框架 Spring AOP 是一个很好的框架,AspectJ 更强大和高效。仅仅因为其有限的 AOP 功能而使用 Spring 将是疯狂的。我真的不知道为什么人们在 Java 中提到 AOP 时首先想到 Spring AOP,而不是 AspectJ。

在某些时候,方面需要 "weaved" 到 类 中,这样他们就可以 运行。这可以在 runtime or at compile 时间完成。

我实际上建议您使用编译时,因为我认为它可以显着简化 aspectj 的使用(我已经相当成功地使用编译时很长时间了)。

您只需要为此找到并配置 gradle 插件(我使用 maven)。

你有没有尝试过类似的东西:

@Around("@annotation(mycustomannotation.package.MyCustomAnnotation)")

其中 mycustomannotation.package.MyCustomAnnotation 是您创建的注释的界面