我有一个特定的包的这个工作代码,但我想配置它为所有控制器,服务和dao包
例如
例如
> com.abc.xyz.content.controller
> com.abc.xyz.content.service
> com.abc.xyz.content.dao
> com.abc.xyz.category.controller
> com.abc.xyz.category.service
> com.abc.xyz.category.dao
等等. . .
这是我的项目的基础包,有人可以帮助我如何去做,以便它适用于我的网络项目的所有类,包括控制器,谢谢提前.
. .
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,顺便说一下,只是因为它有点更短,更容易阅读.你可能已经猜到了,符号是指“任何包或子包”,而在表达式后面的*表示“任何类中的任何方法”.