你没有见过的Spring AOP自定义注解之异常日志记录,强大到没朋友!

本文介绍了Spring AOP的基本概念,包括JDK动态代理与Cglib的区别,Spring AOP与AspectJ的差异,以及AOP的使用流程。通过详细步骤展示了如何在Spring Boot中实现自定义注解,用于记录系统异常日志。涉及到的类包括SystemLogBeanLocal、SystemLogBean、SystemLogMapper及对应的Mybatis实现。在实际应用中,注解可在控制器层使用,以标记需要记录异常的方法。文章还提醒了在不同JDK版本下可能出现的问题以及execution表达式的使用。
摘要由CSDN通过智能技术生成

一、Spring AOP基本概念

1)是一种动态编译期增强性AOP的实现
2)与IOC进行整合,不是全面的切面框架
3)与动态代理相辅相成
4)有两种实现:基于jdk动态代理、cglib

2020整理收集的一些面试题(都整理成文档),有很多干货,包含mysql,netty,spring,线程,spring cloud等详细讲解,也有详细的学习规划图,面试题整理等,我感觉在面试这块讲的非常清楚 :
获取面试资料只需:点击这里领取!!!暗号:CSDN在这里插入图片描述

二、JDK动态代理与Cglib的区别

1)jdk的动态代理需要实现接口 InvocationHandler
2)cglib无需实现接口,使用字节码技术去修改class文件使继承
3)spring默认使用jdk动态代理,如果没有实现接口会使用cglib

二、Spring AOP与AspectJ区别

Spring的AOP是基于动态代理的,动态增强目标对象,而AspectJ是静态编译时增强,需要使用自己的编译器来编译,还需要织入器
使用AspectJ编写的java代码无法直接使用javac编译,必须使用AspectJ增强的ajc增强编译器才可以通过编译,写法不符合原生Java的语法;而Spring AOP是符合Java语法的,也不需要指定编译器去编译,一切都由Spring 处理。

四、AOP使用流程

1)定义业务组件
2)定义切点(重点)
3)定义增强处理方法(切面方法)

五、Spring下的jar包依赖(以jdk1.8为例)

aspectjweaver-1.8.9.jar
aspectjrt-1.8.9.jar
aopalliance-1.0.jar
spring-aop-4.3.7.RELEASE.jar

六、代码实现过程

(一)、spring-mvc.xml配置

    1)、声明
    ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201217202032578.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl81MDkxNzQ0OQ==,size_16,color_FFFFFF,t_70)

2)开启注解

<mvc:annotation-driven />
        3)开启控制层的扫描范围,自动扫描通过注解配置的组件
<context:component-scan base-package="com.xxxx.util.web.controller" />
        4)启动对@AspectJ注解的支持
<aop:aspectj-autoproxy proxy-target-class="true" />
       proxy-target-class默认是false:如果类实现了接口就走JDK代理,如果没有,走cglib代理
        true:是强制使用cglib代理
        5)切面Bean
<bean id="logAopController"
    class="com.xxxx.util.web.controller.LogAopController">
</bean>

(二)、切面代码

LogAopController.java
import java.lang.reflect.Method;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import javax.ejb.EJB;
import javax.servlet.http.HttpServletRequest;

import org.apache.commons.lang3.StringUtils;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

@Component
@Aspect
public class <
  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值