使用AOP记录异常日志

AOP称为面向切面编程,在程序开发中主要用来解决一些系统层面上的问题,比如日志,事务,权限等等

一、AOP基本概念

  • Aspect(切面):通常是一个类,里面可以定义切入点和通知

  • JointPoint(连接点):程序执行过程中明确的点,一般是方法的调用

  • Advice(通知):AOP在特定的切入点上执行的增强处理,定义了切面是什么及何时使用,应该应用在某个方法被调用之前,调用之后,还是抛出异常时。有before,after,afterReturning,afterThrowing,around

  • Pointcut(切入点):就是带有通知的连接点,在程序中主要体现为书写切入点表达式(即aop拦截的方法)

  • AOP代理:AOP框架创建的对象,代理就是目标对象的加强。Spring中的AOP代理可以使JDK动态代理,也可以是CGLIB代理,前者基于接口,后者基于子类

二、实现策略

  1. Java SE动态代理:
    使用动态代理可以为一个或多个接口在运行期动态生成实现对象,生成的对象中实现接口的方法时可以添加增强代码,从而实现AOP。缺点是只能针对接口进行代理,另外由于动态代理是通过反射实现的,有时可能要考虑反射调用的开销。

  2. 字节码生成(CGLib 动态代理)
    动态字节码生成技术是指在运行时动态生成指定类的一个子类对象,并覆盖其中特定方法,覆盖方法时可以添加增强代码,从而实现AOP。其常用工具是cglib。

  3. 定制的类加载器
    当需要对类的所有对象都添加增强,动态代理和字节码生成本质上都需要动态构造代理对象,即最终被增强的对象是由AOP框架生成,不是开发者new出来的。解决的办法就是实现自定义的类加载器,在一个类被加载时对其进行增强。JBoss就是采用这种方式实现AOP功能。

  4. 代码生成
    利用工具在已有代码基础上生成新的代码,其中可以添加任何横切代码来实现AOP。

  5. 语言扩展
    可以对构造方法和属性的赋值操作进行增强,AspectJ是采用这种方式实现AOP的一个常见Java语言扩展。

三、使用AOP记录异常信息

1、启用@AsjectJ支持


//注解启用的方式

@EnableAspectJAutoProxy

//xml启用的方式

<aop:aspectj-autoproxy/>


2、定义一个切面


import org.aspectj.lang.JoinPoint;

import org.aspectj.lang.annotation.AfterThrowing;

import org.aspectj.lang.annotation.Aspect;

import org.springframework.stereotype.Component;

@Aspect

@Component

public class ExceptionTaken {

@AfterThrowing(throwing = "ex", pointcut = "execution(* com.lzhwy.boot_1.service.BootService..*(..))")

public void takeExceptionLog(JoinPoint joinPoint, Throwable ex) {

System.out.println(joinPoint.getSignature().getName() + "出现异常了");

System.out.println(ex.getMessage());

}

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容