學習java100多天和2天的記錄----日誌、AOP等等等等
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("====================================================");
}
}