我有针对特定软件包的此工作代码,但我想针对所有 controllers , service 和 dao 软件包进行配置
等等。。。那是我项目的基本软件包,有人可以帮忙我如何做,以便它可以用于我的Web项目的所有类,包括控制器,在此先感谢。。。
package com.abc.xyz.utilities; import java.util.Arrays; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.AfterReturning; import org.aspectj.lang.annotation.AfterThrowing; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Pointcut; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; @Aspect @Component public class LoggingAspect { private Log log = LogFactory.getLog(this.getClass()); @Pointcut("execution(* com.abc.xyz.content.service..*(..))") protected void loggingOperation() { } @Before("loggingOperation()") @Order(1) public void logJoinPoint(JoinPoint joinPoint) { log.info("Signature declaring type : " + joinPoint.getSignature().getDeclaringTypeName()); log.info("Signature name : " + joinPoint.getSignature().getName()); log.info("Arguments : " + Arrays.toString(joinPoint.getArgs())); log.info("Target class : " + joinPoint.getTarget().getClass().getName()); } @AfterReturning(pointcut = "loggingOperation()", returning = "result") @Order(2) public void logAfter(JoinPoint joinPoint, Object result) { log.info("Exiting from Method :" + joinPoint.getSignature().getName()); log.info("Return value :" + result); } @AfterThrowing(pointcut = "execution(* com.abc.xyz.content.service..*(..))", throwing = "e") @Order(3) public void logAfterThrowing(JoinPoint joinPoint, Throwable e) { log.error("An exception has been thrown in " + joinPoint.getSignature().getName() + "()"); log.error("Cause :" + e.getCause()); } @Around("execution(* com.abc.xyz.content.service..*(..))") @Order(4) public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable { log.info("The method " + joinPoint.getSignature().getName() + "() begins with " + Arrays.toString(joinPoint.getArgs())); try { Object result = joinPoint.proceed(); log.info("The method " + joinPoint.getSignature().getName() + "() ends with " + result); return result; } catch (IllegalArgumentException e) { log.error("Illegal argument " + Arrays.toString(joinPoint.getArgs()) + " in " + joinPoint.getSignature().getName() + "()"); throw e; } } }
这些选择之一如何?
A)具有程序包限制的常规执行切入点:
execution(* *(..)) && ( within(com.abc.xyz..controller..*) || within(com.abc.xyz..service..*) || within(com.abc.xyz..dao..*) )
B)程序包限制的执行切入点:
execution(* com.abc.xyz..controller..*(..)) || execution(* com.abc.xyz..service..*(..)) || execution(* com.abc.xyz..dao..*(..))
顺便说一句,我更喜欢B,因为它更短并且更容易阅读。您可能已经猜到了,..表示法的意思是“任何包或子包”,而*在表达式的末尾..表示“任何类中的任何方法”。
..
*