gpt4 book ai didi

java - 在 Spring AOP 或 AspectJ 中拦截带注释的类和方法

转载 作者:行者123 更新时间:2023-12-02 00:34:26 25 4
gpt4 key购买 nike

所以我有一个自定义注释

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Intercepted {}

我想用它来将方面编织到方法中(AspectJ,@annotation(Intercepted))。

这个想法是,当我直接注释方法 @Intercepted 时,我会编织方面 - 该部分有效 - 或者如果我注释类,则应将方面编织到其所有 ( public) 方法——那部分没有。

此外,如果我注释一个类及其方法之一,则该方面应该只编织一次,方法级注释将覆盖类级注释。

本质上,我想要“如果存在类级注释,则添加类级注释,但前提是还没有方法级注释。”

我该怎么做?

最佳答案

这是一个 AspectJ 示例。 Spring AOP 中的切入点语法是相同的。

帮助类:

package de.scrum_master.app;

import java.lang.annotation.*;

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Intercepted {}
package de.scrum_master.app;

@Intercepted
public class AnnotatedClass {
public void doSomething() {}
public void doSomethingElse() {}
}
package de.scrum_master.app;

public class AnnotatedMethod {
@Intercepted
public void doSomething() {}
public void doSomethingElse() {}
}
package de.scrum_master.app;

@Intercepted
public class AnnotatedMixed {
@Intercepted
public void doSomething() {}
public void doSomethingElse() {}
}

驱动程序应用程序(Java SE,无 Spring):

package de.scrum_master.app;

public class Application {
public static void main(String[] args) {
// Should be logged
new AnnotatedClass().doSomething();
// Should be logged
new AnnotatedClass().doSomethingElse();

// Should be logged
new AnnotatedMethod().doSomething();
// Should NOT be logged
new AnnotatedMethod().doSomethingElse();

// Should be logged, but only once
new AnnotatedMixed().doSomething();
// Should be logged
new AnnotatedMixed().doSomethingElse();
}
}

方面:

请注意execution(* *(..)) &&部分在 Spring AOP 中不是必需的,因为那里只支持方法执行连接点。切入点可以是 annotatedMethod() || annotatedClass()那里。在 AspectJ 中,我必须更加精确,因为否则会记录其他连接点类型。

package de.scrum_master.aspect;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;

@Aspect
public class AnnotationInterceptor {
@Pointcut("@annotation(de.scrum_master.app.Intercepted)")
public void annotatedMethod() {}

@Pointcut("@within(de.scrum_master.app.Intercepted)")
public void annotatedClass() {}

@Before("execution(* *(..)) && (annotatedMethod() || annotatedClass())")
public void log(JoinPoint thisJoinPoint) {
System.out.println(thisJoinPoint);
}
}

控制台日志:

execution(void de.scrum_master.app.AnnotatedClass.doSomething())
execution(void de.scrum_master.app.AnnotatedClass.doSomethingElse())
execution(void de.scrum_master.app.AnnotatedMethod.doSomething())
execution(void de.scrum_master.app.AnnotatedMixed.doSomething())
execution(void de.scrum_master.app.AnnotatedMixed.doSomethingElse())

关于java - 在 Spring AOP 或 AspectJ 中拦截带注释的类和方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56455428/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com