栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java实现@Log日志 - AOP技术

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java实现@Log日志 - AOP技术

1、 新建maven项目

2、 配置pom.xml 2.1 maven项目像springboot项目那样运行
  • 第一步
 
 
     org.springframework.boot
     spring-boot-starter-parent
     2.4.3
 
  • 第二步

    org.springframework.boot
    spring-boot-starter-web
    2.4.3

  • 第三步

    
    ${project.artifactId}
    
        
        
            org.springframework.boot
            spring-boot-maven-plugin
        
    

图例:

2.2 导入实现aop的依赖


    org.springframework.boot
    spring-boot-starter-aop
    2.4.3

3、@Log的注解类实现 3.1 Log注解类代码
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Log {
    
    boolean request() default true;

    
    boolean response() default true;

    
    boolean runTime() default true;

    
    boolean exceptionOnly() default false;
}
3.2 四个元注解

@Target: 描述注解的使用范围(类、方法、属性)!

@Retention:描述注解的声明周期! [SOURCE源代码 、CLASS 、RUNTIME运行]

@Document:说明该注解包含在javadoc中!

@Inherited:说明子类可以继承父类中的该注解!

4、 @Log的aop实现
  • 说明:一个方法的执行流程!

1、 先扫描该方法所属的类是否有@Log注解,如果有则直接进行logHandler()方法的调用;
2、 如果没有则进行pjp.proceed()方法的调用;
3、 扫描方法是否有@Log注解,如果有则进行logHandler()方法的调用;

@Aspect
@Component
public class LogAop {

    private static final Logger logger = LoggerFactory.getLogger(LogAop.class);

    
    @Around(value = "@annotation(log)")
    public Object aroundMethod(ProceedingJoinPoint pjp, Log log) throws Throwable {
        return logHandler(pjp, log);
    }

    
    @Around(value = "@annotation(log)")
    public Object aroundClass(ProceedingJoinPoint pjp, Log log) throws Throwable {
        MethodSignature ms = (MethodSignature) pjp.getSignature();
        Method method = ms.getMethod();
        //获取方法上的Log注解
        Log methodLog = AnnotationUtils.findAnnotation(method, Log.class);
        if(methodLog != null){
            return pjp.proceed();
        }
        return logHandler(pjp, log);
    }

    public Object logHandler(ProceedingJoinPoint pjp, Log log) throws Throwable {
        // 获得切点处的方法签名 有参方法:Hello.hello(..); 无参数方法:Hello.hello()
        String signature = pjp.getSignature().toShortString();
        //获取请求参数
        String request = Arrays.toString(pjp.getArgs());
        //打印请求参数(打印参数请求 + 非异常也进行参数打印)
        if (Boolean.TRUE.equals(log.request()) && !Boolean.TRUE.equals(log.exceptionOnly())) {
            logger.info("{}的请求参数为:{}", signature, request);
        }
        // 获取开始时的时间戳
        long start_time = System.currentTimeMillis();
        Object returnObject = null;
        try {
            returnObject = pjp.proceed(pjp.getArgs());
        } catch (Throwable throwable) {
            // 仅异常情况下进行参数打印
            if (Boolean.TRUE.equals(log.request()) && Boolean.TRUE.equals(log.exceptionOnly())) {
                logger.info("{}的请求参数为: {}", signature, request);
            }
            throw throwable;
        }
        if (Boolean.TRUE.equals(log.response()) && !Boolean.TRUE.equals(log.exceptionOnly())) {
            logger.info("{}返回结果为:{}", signature, returnObject);
        }
        // 打印运行时间 (非异常情况打印)
        if (Boolean.TRUE.equals(log.runTime()) && !Boolean.TRUE.equals(log.exceptionOnly())) {
            logger.info("{}运行时间为:{}ms", signature, System.currentTimeMillis() - start_time);
        }
        return returnObject;
    }

}
5、 测试类
  • controller
@RestController
@RequestMapping("test")
@Log
public class TestController {

    @Log
    @GetMapping("testGet")
    public String testGet(@RequestParam Long id) {
        System.out.println("id ========= " + id);
        return "id ============ " + id;
    }

}
6、启动类
@SpringBootApplication
public class MyAopLoaderApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyAopLoaderApplication.class);
    }
}
7、测试结果

测试地址:http://localhost:8080/test/testGet?id=1111

  • 测试结果

    由此开启@Log的AOP实现!!!!!!!!!!
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1027783.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号