java - 用于接口(interface)和其中带注释的方法的 Spring AOP

标签 java spring aop

我有这样的服务代码:

@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{
}
  • 代码 A1 在代码 S1 之前调用 -- OK
  • 代码 A1 在代码 S2 之前调用 -- OK
  • 代码 A2 未在代码 S2 之前调用 -- 不正常

我做错了什么?

代码是用 Java 7 和 Spring 3.1.3 编写的。

更新

我试过另一种方法。我使用“Around”建议而不是“Before”和“After”来访问 ProceedingJoinPoint。在此建议中,我通过反射检查方法是否具有注释“com.xyz.WithAuthorization”:

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

我的注解有“@Retention(RetentionPolicy.RUNTIME)”,但我在调试器中看到方法签名在运行时缺少注解。所以问题依然存在。

最佳答案

Spring 引用 this link

例如在 Spring 引用中

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

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

execution(* com.xyz.service.AccountService.*(..))

执行方法具有@Transactional 注释的任何连接点(仅在 Spring AOP 中执行方法):

@annotation(org.springframework.transaction.annotation.Transactional)

我建议你使用...

@Before("execution(* com.xyz.WithSession.*(..)) && @annotation(authorization)")
public void adviceBeforeWithAuthorizationMethodFromClassImplementingWithSession(WithAuthorization authorization) {
    // code A2
}

关于java - 用于接口(interface)和其中带注释的方法的 Spring AOP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26158913/

相关文章:

Java:在目录之间复制文件

javascript - 我如何在 JSP 中使用 JavaScript 的 session 存储?

c# - 检查方法是否通过反射实现 IDisposable.Dispose

function - C->函数库中面向方面的编程?

java - 如何为 HK2 中的服务创建代理

tomcat - tomcat 发行版上 java 类库的配置

java - 如何在 Spring 中将一组组件与 Swing 布局管理器居中对齐

java - 连接数据库时出现 SQlite 错误

spring - 为什么我用Spring Data MongoDB得到 "No property node found on entity class … to bind constructor parameter to!"

java - spring项目中AOP最常见的用途是什么