zoukankan      html  css  js  c++  java
  • [Java Spring] Aspect

    Create you own decreator!

    Add dependency:

            <dependency>
                <groupId>org.aspectj</groupId>
                <artifactId>aspectjweaver</artifactId>
                <version>1.9.5</version>
            </dependency>
            <dependency>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-log4j12</artifactId>
                <version>1.7.30</version>
            </dependency>

    aspect/Loggable.java:

    package com.frankmoley.lil.fid.aspect;
    
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    
    @Target(ElementType.METHOD)
    @Retention(RetentionPolicy.RUNTIME)
    public @interface Loggable {
    }

    aspect/LoggingAspect.java:

    package com.frankmoley.lil.fid.aspect;
    
    import java.util.Arrays;
    import java.util.Collection;
    
    import org.aspectj.lang.JoinPoint;
    import org.aspectj.lang.annotation.AfterReturning;
    import org.aspectj.lang.annotation.Aspect;
    import org.aspectj.lang.annotation.Before;
    import org.aspectj.lang.annotation.Pointcut;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.stereotype.Component;
    
    @Component
    @Aspect
    public class LoggingAspect {
    
        private static final Logger LOGGER = LoggerFactory.getLogger(LoggingAspect.class);
    
        @Pointcut("@annotation(Loggable)")
        public void executeLogging(){}
    
        @AfterReturning(value = "executeLogging()", returning = "returnValue")
        public void logMethodCall(JoinPoint joinPoint, Object returnValue){
            StringBuilder message = new StringBuilder("Method: ");
            message.append(joinPoint.getSignature().getName());
            Object[] args = joinPoint.getArgs();
            if (null!=args && args.length>0){
                message.append(" args=[ | ");
                Arrays.asList(args).forEach(arg->{
                    message.append(arg).append(" | ");
                });
                message.append("]");
            }
            if(returnValue instanceof Collection){
                message.append(", returning: ").append(((Collection)returnValue).size()).append(" instance(s)");
            }else{
                message.append(", returning: ").append(returnValue.toString());
            }
    
            LOGGER.info(message.toString());
        }
    
    
    }

    Using;

    @Service
    public class GreetingService {
    
        @Value("${app.greeting}")
        private String greeting;
    
        public GreetingService(){
            super();
        }
    
        @Loggable
        public String getGreeting(String name){
            return greeting + " " + name;
        }
    }

    Around:

        @Around(value = "executeLogging()")
        public Object logMethodCall(ProceedingJoinPoint joinPoint) throws Throwable {
            long startTime = System.currentTimeMillis();
            Object returnValue = joinPoint.proceed();
            long totalTime = System.currentTimeMillis()-startTime;
            StringBuilder message = new StringBuilder("Method: ");
            message.append(joinPoint.getSignature().getName());
            message.append(" totalTime: ").append(totalTime).append("ms");
            Object[] args = joinPoint.getArgs();
            if (null!=args && args.length>0){
                message.append(" args=[ | ");
                Arrays.asList(args).forEach(arg->{
                    message.append(arg).append(" | ");
                });
                message.append("]");
            }
            if(returnValue instanceof Collection){
                message.append(", returning: ").append(((Collection)returnValue).size()).append(" instance(s)");
            }else{
                message.append(", returning: ").append(returnValue.toString());
            }
    
            LOGGER.info(message.toString());
            return returnValue;
        }

  • 相关阅读:
    css实现鼠标悬浮字体流光背景模糊效果
    原生JS实现省市区(县)三级联动选择
    多线程的对象锁和类锁
    session、cookie与“记住我的登录状态”的功能的实现
    Java NIO FileVisitor 高效删除文件
    mysql 服务启动失败
    Http 协议详解
    设计模式 之 策略模式
    简单探讨 javascript 闭包
    数据库SQL优化大总结之 百万级数据库优化方案
  • 原文地址:https://www.cnblogs.com/Answer1215/p/14106596.html
Copyright © 2011-2022 走看看