仅使用AspectJ(无Spring)在注释方法上应用方面

时间:2018-08-31 10:12:43

标签: java gradle aop aspectj

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

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

3 个答案:

答案 0 :(得分:1)

您是否尝试过以下方法:

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

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

答案 1 :(得分:0)

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

当您的周围建议返回void时,它只能拦截也返回void的方法。不过,您可能正在尝试拦截其他返回类型的方法,因为您没有共享目标代码,所以我只能推测。确保周围的建议返回Object(或目标方法具有的返回类型),并且建议返回proceed()的结果。

顺便说一句,您决定不使用Spring仅仅是因为它的“ AOP lite”框架Spring AOP是一个很好的框架,AspectJ更加强大和高效。仅出于有限的AOP功能而使用Spring会很疯狂。我真的不知道为什么人们在考虑Java AOP时会首先考虑Spring AOP,而不是AspectJ。

答案 2 :(得分:0)

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

事实上,我建议您使用编译时间,因为我认为这大大简化了AspectJ的使用(我已经很长时间成功地使用了编译时间)。

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