【问题标题】:Apply aspect only on annotated methods using AspectJ(without Spring)使用 AspectJ(无 Spring)仅在带注释的方法上应用方面
【发布时间】:2019-02-06 08:29:59
【问题描述】:

我想在有一些资源限制的 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'

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

【问题讨论】:

    标签: java gradle aop aspectj


    【解决方案1】:

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

    当你的环绕通知返回void时,它只能拦截也返回void的方法。可能您正在尝试拦截具有其他返回类型的方法,但是,我只能推测,因为您没有共享目标代码。确保 around 通知返回 Object(或您的目标方法具有的任何返回类型),并且通知返回 proceed() 的结果。

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

    【讨论】:

      【解决方案2】:

      在某些时候需要将方面“编织”到类中,以便它们可以运行。这可以在runtimecompile 时间完成。

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

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

      【讨论】:

        【解决方案3】:

        您是否尝试过类似的方法:

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

        其中 mycustomannotation.package.MyCustomAnnotation 是您创建的注释的接口

        【讨论】:

        • 是的,这解决了问题,但我还添加了一些其他内容,可以避免重复执行方面。 @Around("execution(* *(..)) && @annotation(spike.HelloAnnotation)") 另外,我没有在 IntelliJ 中运行 GradleTest 运行器,一旦启用它,一切运行良好。谢谢
        猜你喜欢
        • 1970-01-01
        • 2021-03-28
        • 1970-01-01
        • 2019-10-20
        • 1970-01-01
        • 1970-01-01
        • 2013-02-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多