我想在具有某些资源限制的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'
我不知道为什么该方面没有被触发,当应用运行时,我无法在控制台中看到该方面的消息。 知道我缺少什么吗?
答案 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)