spring AOP定义AfterThrowing增加处理实例分析

下面为您详细讲解Spring AOP定义AfterThrowing增加处理实例的完整攻略。

什么是Spring AOP?

Spring AOP(Aspect Oriented Programming)是Spring框架的一个重要特性,主要为了解决在面向对象编程中的一些常见问题,如日志等处理。

Spring AOP主要是通过代理和横切面实现的,代理是对目标对象进行封装,而横切面则是抽取出横跨于应用程序多个模块中的通用行为。

什么是AfterThrowing增强?

AfterThrowing增强可以在方法抛出异常后执行一段代码,包括记录日志、抛出异常等处理。

Spring AOP定义AfterThrowing增加处理实例分析

在Spring AOP中定义AfterThrowing增强的步骤如下:

  1. 定义切面类
    定义一个切面类,并使用@Aspect注解标记该类为切面类。在切面类中定义一个需要增强的方法,并使用@AfterThrowing注解标记该方法为处理异常的增强。

示例代码如下:

@Aspect
public class ExceptionHandlerAspect {

    @AfterThrowing(pointcut = "execution(* com.example.demo.service.*.*(..))", throwing = "exception")
    public void afterThrowing(JoinPoint joinPoint, Exception exception) {
        // 记录日志
        Logger logger = LoggerFactory.getLogger(joinPoint.getTarget().getClass());
        logger.error("方法执行异常:", exception);

        // 抛出自定义异常
        throw new CustomException("方法执行异常", exception);
    }
}

在上述代码中,@AfterThrowing标记了afterThrowing方法,该方法会在Service层执行方法抛出异常时被调用,记录日志并抛出自定义异常。

  1. 定义切入点
    定义一个切入点,并使用@Pointcut注解标记该切入点。

示例代码如下:

@Pointcut("execution(* com.example.demo.service.*.*(..))")
public void servicePointcut() {}

在上述代码中,@Pointcut标记了servicePointcut方法,该方法定义了需要增强的Service层方法。

  1. 将切面类和切入点绑定
    在配置文件中将切面类和切入点绑定起来。

示例代码如下:

<aop:aspectj-autoproxy />

<bean id="exceptionHandlerAspect" class="com.example.demo.aop.ExceptionHandlerAspect" />

<aop:config>
    <aop:aspect ref="exceptionHandlerAspect">
        <aop:after-throwing method="afterThrowing" pointcut-ref="servicePointcut" throwing="exception" />
    </aop:aspect>
</aop:config>

在上述代码中,自动创建代理对象,定义切面类,定义切面,定义增强。

示例一

以Spring AOP实现日志记录为例子。如果我们在Service层定义了方法,需要在方法结束时记录日志。

  1. 定义切面类
@Aspect
@Component
public class LogAspect {

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

    @Around("execution(* com.example.demo.service.*.*(..))")
    public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable {

        // 记录方法开始执行的时间
        long start = System.currentTimeMillis();

        // 执行目标方法
        Object proceed = joinPoint.proceed();

        // 记录方法结束执行的时间
        long end = System.currentTimeMillis();

        // 遍历参数,并生成参数列表
        StringBuilder params = new StringBuilder();
        for (Object arg : joinPoint.getArgs()) {
            if (arg instanceof HttpServletRequest) {
                HttpServletRequest request = (HttpServletRequest) arg;
                params.append("{Request URL:").append(request.getRequestURL()).append(", Request Method:").append(request.getMethod()).append("}");
            } else if (arg instanceof HttpServletResponse) {
                continue;
            } else {
                params.append(arg).append(",");
            }
        }

        // 记录日志
        logger.info("[Method:{}] [Params:{}] [Cost:{}ms]", joinPoint.getSignature().getName(), params, (end - start));

        // 返回返回值
        return proceed;
    }
}

在上述代码中,@Around注解标记了logAround()方法,该方法在Service层方法执行前后拦截,记录方法的名称、参数、执行时间等信息。

  1. 配置文件中添加定义的切面类
<aop:config>
    <aop:aspect ref="logAspect">
        <aop:around method="logAround" pointcut="execution(* com.example.demo.service.*.*(..))" />
    </aop:aspect>
</aop:config>

在上述代码中,标记了需要增强Service层的方法,标记了切面类。

示例二

以Spring AOP实现事务管理为例子。如果我们在DAO层定义了方法,需要在方法开始执行前开启一个事务,在方法执行完成后提交或回滚事务。

  1. 定义切面类
@Aspect
@Component
public class TransactionAspect {

    @Autowired
    private DataSourceTransactionManager transactionManager;

    private TransactionStatus status;

    @Pointcut("execution(* com.example.demo.dao.*.*(..))")
    public void transactionPointcut() {}

    @Before("transactionPointcut()")
    public void before() {
        // 开启事务
        status = transactionManager.getTransaction(new DefaultTransactionDefinition());
    }

    @AfterReturning(returning = "result", pointcut = "transactionPointcut()")
    public void afterReturning(JoinPoint joinPoint, Object result) {
        // 提交事务
        transactionManager.commit(status);
    }

    @AfterThrowing(throwing = "ex", pointcut = "transactionPointcut()")
    public void afterThrowing(Exception ex) {
        // 回滚事务
        transactionManager.rollback(status);
    }
}

在上述代码中,@Aspect注解标记了该类为切面类,@Pointcut定义了需要增强DAO层的方法,@Before、@AfterReturning、@AfterThrowing分别代表事务开启、事务提交及事务回滚。

  1. 配置文件中添加定义的切面类
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource" />
</bean>

<aop:config>
    <aop:aspect ref="transactionAspect">
        <aop:before pointcut="execution(* com.example.demo.dao.*.*(..))" method="before" />
        <aop:after-returning pointcut="execution(* com.example.demo.dao.*.*(..))" method="afterReturning" returning="result" />
        <aop:after-throwing pointcut="execution(* com.example.demo.dao.*.*(..))" method="afterThrowing" throwing="ex" />
    </aop:aspect>
</aop:config>

在上述代码中,定义了用于操作事务的数据源,而标记了需要增强DAO层的方法。

希望以上内容对您有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:spring AOP定义AfterThrowing增加处理实例分析 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • 使用hibernate和struts2实现分页功能的示例

    使用Hibernate和Struts2实现分页功能可以分为以下几个步骤: 添加依赖 在pom.xml文件中添加Hibernate和Struts2的依赖,示例代码如下: <dependencies> <!– Hibernate –> <dependency> <groupId>org.hibernate&lt…

    Java 2023年5月20日
    00
  • OpenGL ES 矩阵变换及其数学原理详解(五)

    “OpenGL ES 矩阵变换及其数学原理详解(五)”这篇文章主要讲解了OpenGL ES中矩阵变换的相关知识和数学原理。文章详细介绍了矩阵变换的分类、矩阵乘法的实现方法以及如何将多个矩阵相乘得到最终的变换矩阵。本文也涉及了矩阵的分解以及常见的变换操作,如缩放、平移、旋转等。同时,本文还通过示例展示了如何使用矩阵变换实现精灵动画效果。 本文通过多个示例详细说…

    Java 2023年5月26日
    00
  • 一个低学历者的辛酸程序路[贵在坚持]

    下面是详细讲解“一个低学历者的辛酸程序路[贵在坚持]”的完整攻略。 标题 一个低学历者的辛酸程序路[贵在坚持] 简介 本文将讲述一个低学历者的辛酸程序路,并分享如何在学历不高的情况下,通过坚持学习和实践,成为一名优秀的程序员。 正文 从自学开始 程序开发本来是需要较高的学历和技能的,但是通过自学,你也可以掌握开发技术。首先,选择一门开发语言,如Java或Py…

    Java 2023年5月26日
    00
  • Java中获取子字符串的几种方法示例

    关于Java中获取子字符串的几种方法,其实有很多种,下面我来逐一讲解。 String类的substring方法 String类的substring方法可以用于截取字符串中的一部分,包含起始位置但不包含结尾位置。方法的签名如下: public String substring(int beginIndex, int endIndex) 其中,beginInde…

    Java 2023年5月27日
    00
  • 如何实现 Java SpringBoot 自动验证入参数据的有效性

    Java SpringBoot 通过javax.validation.constraints下的注解,实现入参数据自动验证如果碰到 @NotEmpty 否则不生效,注意看下 @RequestBody 前面是否加上了@Valid Validation常用注解汇总 Constraint 详细信息 @Null 被注释的元素必须为 null @NotNull 被注释…

    Java 2023年4月18日
    00
  • Java中BM(Boyer-Moore)算法的图解与实现

    Java中BM(Boyer-Moore)算法的图解与实现 前言 本文主要介绍在Java中实现BM算法。BM算法是一种高效的模式匹配算法,其核心思想是,对于模式串的每个字符,在匹配串中寻找该字符时,优先从模式串的尾部开始匹配,以减少匹配步骤。本文将详细介绍BM算法的流程,并提供两个示例以帮助读者更好地理解该算法。 算法流程 计算字符偏移量表 字符集假设有m个字…

    Java 2023年5月19日
    00
  • 什么是对象头?

    在Java中,每个对象都有一个对象头,用于存储对象的元数据信息。对象头包含了对象哈希码、锁状态、GC信息等。头的大小在不同的JVM实现中可能会有所不同,但通常是8字节或12字节。 以下是对象头的完使用攻略: 1. 对象头的结构 在Java中,对象头的结构通常包含了以下信息: Mark Word:用存储对象的哈希码、锁状态、GC信息等。 Class Point…

    Java 2023年5月12日
    00
  • Java中的NullPointerException如何避免?

    Java中的NullPointerException(空指针异常)是一种常见的运行时异常,在处理对象时,如果操作了空对象,就有可能出现NullPointerException,导致程序崩溃。为了避免NullPointerException出现,我们需要注意以下几点: 1. 空指针判断 在操作可能会出现空指针异常的对象之前,要进行空指针判断以避免程序崩溃。可以…

    Java 2023年4月27日
    00
合作推广
合作推广
分享本页
返回顶部