当前位置: 首页 > 知识库问答 >
问题:

Spring AOP用于接口及其带注释的方法

秦奇
2023-03-14
@Component
public class MyService implements com.xyz.WithSession {

    public void someMethodWhichDoesNotNeedAutorization() {
        // code S1
    }

    @com.xyz.WithAuthorization
    public void someMethodWhichNeedAutorization() {
        // code S2
    }
}
@Aspect
public class MyAspect {

    @Before("target(com.xyz.WithSession)")
    public void adviceBeforeEveryMethodFromClassImplementingWithSession() {
        // code A1
    }

    @Before("target(com.xyz.WithSession) && @annotation(com.xyz.WithAuthorization)")
    public void adviceBeforeWithAuthorizationMethodFromClassImplementingWithSession() {
        // code A2
    }
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface WithAuthorization{
}
    null

代码是用Java7和Spring3.1.3编写的。

我试过另一种方法。我使用“around”建议而不是“before”和“after”来访问ProcedingJoinPoint。在这个建议中,我通过反射检查方法是否具有注释'com.xyz.WithAuthorization':

private boolean isAnnotated(ProceedingJoinPoint proceedingJoinPoint) {
    MethodSignature signature = (MethodSignature) proceedingJoinPoint.getSignature();
    return signature.getMethod().isAnnotationPresent(com.xyz.WithAuthorization);
}

我的批注有'@retentionpolicy.runtime),但我在调试器中看到,在运行时,方法签名中缺少批注。所以问题仍然存在。

共有1个答案

经清野
2023-03-14

在Spring中,请参阅此链接

例如在Spring参考资料中

@Before("com.xyz.lib.Pointcuts.anyPublicMethod() && @annotation(auditable)")
public void audit(Auditable auditable) {
    AuditCode code = auditable.value();
    // ...
}

AccountService接口定义的任何方法的执行:

execution(* com.xyz.service.AccountService.*(..))
@annotation(org.springframework.transaction.annotation.Transactional)
@Before("execution(* com.xyz.WithSession.*(..)) && @annotation(authorization)")
public void adviceBeforeWithAuthorizationMethodFromClassImplementingWithSession(WithAuthorization authorization) {
    // code A2
}
 类似资料:
  • 我把(lombok)注释放在一个参数之前,但是如果实现中没有相同的注释,它就不能单独工作。这意味着在实现这个接口的类的方法中,我将需要再次放入这个注释,从而复制代码。 问题是,事情应该是这样吗?如果您只将此注释放在接口中,它们将不起作用,如果您只将其放在实现接口的类中,那么API用户可能不明白不能传递给这些方法。我该怎么办?

  • 问题内容: 如何编写适用于方法执行的AspectJ切入点,该方法执行会使用注释覆盖接口方法?例如: 仅当带有注释本身时,切入点才匹配。还有另一种方法吗? 问题答案: 正如Nicholas指出的那样,这在AspectJ中是不可能的。这是无法实现的更多证据(摘自http://www.eclipse.org/aspectj/doc/released/adk15notebook/annotations-

  • 问题内容: 我无法弄清楚能够注释Java接口的用例。 也许有人可以给我一个例子? 问题答案: 我在Spring中使用它来注释接口,其中注释应应用于所有子类。例如,假设您有一个Service接口,并且您可能具有该接口的多个实现,但是无论是否有注释,都希望应用安全注释。在这种情况下,对接口进行注释最有意义。

  • 问题内容: 假设我有这个注释类 那么,有没有一种方法可以查看对象,使用@MethodXY注释“查找”该方法,其元素x = 3,y = 2,并调用它? 谢谢 问题答案: 这是一个方法,该方法返回带有特定注释的方法: 可以轻松修改它以满足您的特定需求。请注意,提供的方法会遍历类层次结构,以查找带有所需批注的方法。 这是满足您特定需求的方法: 要调用找到的方法,请参考教程。这里的潜在困难之一是方法参数的

  • 我使用Spring AOP拦截方法执行。 我有一个界面,如下所示: 以下是接口的实现: 现在我希望任何使用@AwesomeAnnoting注释的参数的方法都应该被Spring AOP捕获。 所以我写了以下方面,这是有效的。 但是,当我尝试查找参数注释时,我没有得到任何注释。如上所述,annotationMatrix为空。 所以我的问题是: 为什么annotationMatrix为空?可能是因为参数

  • 我正在实现来传递和获取来自任何类或片段的数据,并且还订阅了一个方法来获取即时更改的数据...但是我收到了以下错误消息: 组织。绿色机器人。事件巴士。EventBusException:订阅者类java。Boolean及其超类没有带有@Subscribe注释的公共方法 我已经订阅了github在这里展示的方法 代码片段 我只发布了应用程序所需的代码,因为这里不需要其他代码 适配器 更新活动类 新错误