问题
I'm using Spring AspectJ for logging method execution statistics, however, I want to exclude some classes and methods from this without changing the pointcut expression.
To exclude certain methods I created a custom annotation which I use to filter out. However I'm unable to do the same with classes.
Here is my aspect definition -
@Around("execution(* com.foo.bar.web.controller.*.*(..)) "
+ "&& !@annotation(com.foo.bar.util.NoLogging)")
public Object log(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
// logging logic here
}
NoLogging
is my custom annotation for excluding methods.
So how can I filter out certain classes without changing pointcut expression and without adding new advisors?
回答1:
Okay so I found the solution - use @target
PCD (pointcut designators) to filter out classes with specific annotation. In this case I already have the @NoLogging
annotation so I can use that. The updated pointcut expression will then become as follows -
@Around("execution(* com.foo.bar.web.controller.*.*(..)) "
+ "&& !@annotation(com.foo.bar.util.NoLogging)"
+ "&& !@target(com.foo.bar.util.NoLogging)")
public Object log(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
// logging logic here
}
Explanation -
execution(* com.foo.bar.web.controller.*.*(..))
- all methods of all classes in c.f.b.w.controller
package
"&& !@annotation(com.foo.bar.util.NoLogging)"
- which do NOT have @NoLogging
annotation on them
"&& !@target(com.foo.bar.util.NoLogging)"
- and whose class also does NOT have @NoLogging
annotation.
So now I simply have to add @NoLogging
annotation to any class whose methods I want to be excluded from the aspect.
More PCD can be found in Spring AOP documentation - http://docs.spring.io/spring/docs/current/spring-framework-reference/html/aop.html#aop-pointcuts-designators
回答2:
As per Spring AOP documentation
PCD can be &&'ed, ||'ed, and ! (negated) too.
So I guess this is more of trial and error exercise. I think you can try something like && !@within
@within is applicable for types. Or you can try !@target
But then again I think it could be tricky.
Another approach: declare two pointcut definitions and combine them. And example, here on the documentation page. I would try this first. Something like
@Pointcut(executionPC() && nonAnnotatedClassesPC() && nonAnnotatedMethodsPC())
Disclaimer: As I said, this looks more like trial and error. And I don't have a clear working example.
来源:https://stackoverflow.com/questions/38822971/spring-aop-exclude-some-classes