1. 程式人生 > >學習java100多天和2天的記錄----日誌、AOP等等等等

學習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("====================================================");
    }
    
}