AOP分为:
切面类
切入点
织入方法
其中织入方法中可以添加参数JoinPoint joinPoint,这个参数很有意思,可以获得被织入方法的很多信息:
getTarget() 获取被织入的类
getSignatrue() 获取被织入的具体方法
getArgs() 获取被织入的方法的 实参
见下面示例,将添加日志的方法切入每个类中:
@Component
@Aspect
public class LogAspect {
Logger logger = LoggerFactory.getLogger( LogAspect.class );
@Pointcut("execution ( * com.dao..*.*(..))")
public void pointCut(){}
// 1) 引用上面定义的 切入点 value="pointCut()"
// 2) 自定义切入点 value="execution(* com.dao..*.*(..))"
@Before(value="pointCut()")
public void logBefore( JoinPoint joinPoint ){
// 开始记录日志
// 记录???
// 哪个类, 哪个方法 ,执行什么样的操作 , 有没有异常发生
// 包名.类名
String className = joinPoint.getTarget().getClass().getName() ;
// joinPoint.getSignature().getDeclaringTypeName()
// 方法名
String methodName = joinPoint.getSignature().getName() ;
// 调用 方法时 传入的 实参
// for ( Object arg : joinPoint.getArgs() ) {
// System.out.println( arg );
// }
logger.warn("====================================================");
logger.warn( "调用了 {} 中的 {} 方法 " , className , methodName );
logger.warn( "以下为实参列表:" );
for( int i=0 ; i< joinPoint.getArgs().length; i++ ) {
logger.warn( "参数{} : {}" , i+1 , joinPoint.getArgs()[i] );
}
}
@AfterReturning(value="pointCut()" , returning="returnObject")
public void logAfterReturning ( Object returnObject ) {
logger.warn( "方法的返回值是: {}" , returnObject );
logger.warn("====================================================");
}
@AfterThrowing(value="pointCut()" , throwing="exception")
public void logAfterThrowing( Exception exception ) {
logger.warn( "方法发生了异常: {}" , exception.getMessage() );
logger.warn("====================================================");
}
}