我有这样的服务代码:
@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/