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;
        }

  • 相关阅读:
    记某农信社面试
    sublime2 c++的一些使用配置
    switch case
    sizeof与strlen的区别 浅谈
    求最大公约数
    Android基础控件——PopupWindow模仿ios底部弹窗
    Android基础控件——ListView实现时间轴效果
    Android基础控件——CardView的使用、仿支付宝银行卡
    Android基础控件——AlertDialog、ProgressDialog实现单选对话框、多选对话框、进度条对话框、输入框对话框
    Android基础——适配安卓6.0新权限系统
  • 原文地址:https://www.cnblogs.com/Answer1215/p/14106596.html
Copyright © 2011-2022 走看看