一文吃透 Spring 中的 AOP 编程

一文吃透 Spring 中的 AOP 编程

什么是 AOP

AOP(Aspect Oriented Programming)即面向切面编程。与 OOP(面向对象编程)不同,AOP 不是关注代码的对象,而是关注在程序运行过程中“特定点”发生的一些处理。其主要作用是在不修改原有逻辑的情况下,对程序进行一些扩展操作,例如:日志记录、性能监控、事务管理等。

Spring 中的 AOP

Spring 是一个重要的 AOP 框架,提供了完整的 AOP 实现,主要思想是通过“环绕通知”(Around Advice)在目标方法执行前、后或发生异常时对其进行增强。

Spring AOP 的核心组件包括:

  • 切面 Aspect:具有相似行为的一组通知和切点的组合。
  • 连接点 Joint Point:程序执行的某个特定位置。
  • 通知 Advice:实际要执行的操作,包括前置通知、后置通知、环绕通知、异常通知和最终通知。
  • 切点 PointCut:决定在哪些连接点上应用通知。

使用 Spring AOP 编写示例

接下来我们结合两个示例,通过 Spring AOP 来实现一些常用的操作。

示例一:日志记录

我们可以通过 AOP 来记录程序的运行日志,主要解决以下几个问题:

  • 记录程序执行时间
  • 记录程序执行过程中的参数信息
  • 记录方法的返回结果
@Component
@Aspect
public class LogAspect {

    private final Logger logger = LoggerFactory.getLogger(this.getClass());

    @Around("execution(* com.example.demo.service.*.*(..))")
    public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
        long startTime = System.currentTimeMillis();
        Object result = joinPoint.proceed();
        long endTime = System.currentTimeMillis();

        logger.info("调用方法:{},执行时间:{}ms,参数信息:{},返回结果:{}",
                joinPoint.getSignature().toLongString(),
                endTime - startTime,
                Arrays.toString(joinPoint.getArgs()),
                result);

        return result;
    }
}

上述代码中,我们使用了 @Aspect 注解标注该类为切面,并使用 @Around 注解标注了环绕通知方法。该方法的参数 ProceedingJoinPoint 表示连接点,其包含了被代理方法的一些信息,例如方法签名、参数等。在方法执行前我们记录了开始时间,方法执行后我们记录了结束时间,并根据连接点获取到了方法传递的参数信息以及返回结果,最后将这些信息输出到日志中。

示例二:事务管理

我们可以通过 AOP 来实现事务管理,主要解决以下几个问题:

  • 开启事务
  • 提交或回滚事务
@Component
@Aspect
public class TransactionAspect {

    @Autowired
    private DataSourceTransactionManager transactionManager;

    // 配置切点
    @Pointcut("execution(* com.example.demo.service.*.*(..))")
    public void pointcut() {}

    @Around("pointcut()")
    public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
        Object result;
        TransactionStatus transactionStatus = null;

        try {
            transactionStatus = transactionManager.getTransaction(new DefaultTransactionDefinition());
            result = joinPoint.proceed();
            transactionManager.commit(transactionStatus); // 提交事务
        } catch (Exception e) {
            if (transactionStatus != null) {
                transactionManager.rollback(transactionStatus); // 回滚事务
            }
            throw e;
        }

        return result;
    }
}

上述代码中,我们同样使用了 @Aspect 注解标注该类为切面,并使用了 @Around 注解标注了环绕通知方法。该方法中,我们使用了 TransactionManager 来进行事务管理。在方法执行前我们开启了一个新的事务,并在方法执行后提交或者回滚这个事务。

后记

以上两个示例仅仅是 AOP 的冰山一角,Spring AOP 可以实现更加丰富的扩展操作,例如缓存管理、权限管理等。但是在实际开发中,也需要注意 AOP 的一些问题,避免出现一些意外情况。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:一文吃透 Spring 中的 AOP 编程 - Python技术站

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

相关文章

  • Mybatis源码解析之事务管理

    Mybatis源码解析之事务管理 什么是事务 事务是指一系列操作,这些操作必须同时成功或者同时失败。比如,银行转账操作就是一个事务,它包括从一个账户扣除金额并把金额加到另一个账户中。这个过程中如果其中一个操作失败,那么这个事务就必须回滚,保证不会出现数据不一致或者数据丢失的情况。 Mybatis中的事务管理 Mybatis提供了基于JDBC的事务管理,其中有…

    Java 2023年5月19日
    00
  • LINQ教程之使用Lambda表达式

    很高兴为您讲解“LINQ教程之使用Lambda表达式”的完整攻略。 什么是Lambda表达式 Lambda表达式源于函数式编程,是一种简洁的表达方式。在C#中,Lambda表达式被用来编写LINQ查询、事件处理程序、委托等。 Lambda表达式的格式如下: (argument-list) => expression 其中,argument-list 是…

    Java 2023年5月19日
    00
  • mybatis快速上手并运行程序

    MyBatis快速上手指南 MyBatis是一个持久化框架,可以帮助Java开发人员快速高效地进行数据库操作。本文将介绍如何快速上手MyBatis并运行程序。 环境准备 安装Java环境(JDK),版本需大于等于1.8 安装并配置Maven,用于管理项目依赖 准备一个MySQL数据库 步骤 1. 创建Maven项目 使用以下命令在本地创建一个Maven项目:…

    Java 2023年5月20日
    00
  • Java实例化一个抽象类对象的方法教程

    Java实例化一个抽象类对象的方法教程 在Java中定义一个抽象类时,它只是一个类的模板,并且不能直接实例化。但是,有时候我们会需要创建一个该抽象类的实例。那么,如何实例化一个抽象类对象呢? 1.使用匿名内部类 使用匿名内部类是实例化抽象类对象的一种常见方法。这种方法利用了Java的多态性,创建一个继承抽象类的实现类的匿名对象。 示例代码: abstract…

    Java 2023年5月26日
    00
  • java字符串求并集的方法

    针对这个问题,我会给出详细的解释和两个示例。 Java字符串求并集的方法 一、使用Java的Set集合 Java的Set集合是不重复的集合,很适合用来进行字符串的并集操作。具体的实现方式是创建两个Set集合,分别用来存储两个字符串的字符,然后将两个集合进行合并,最后输出合并后的结果即可。 下面是示例代码: import java.util.HashSet; …

    Java 2023年5月27日
    00
  • uni-app 微信小程序授权登录的实现步骤

    下面是详细讲解“uni-app 微信小程序授权登录的实现步骤”的完整攻略: 一、前置条件 在进行微信小程序授权登录之前,要确保以下几个前置条件已经满足: 已经注册微信小程序开发者账号,并创建了一个小程序。 在小程序后台设置了合法的“授权域名”。 在小程序后台开启了“用户信息”,并获取了对应的“AppID”和“AppSecret”。 二、授权登录实现步骤 接下…

    Java 2023年5月23日
    00
  • Spring Security用户定义 

    关于“Spring Security 用户定义”的完整攻略,我会分为以下几个步骤来进行讲解: 理解 Spring Security 用户定义的含义和作用; 在项目中集成 Spring Security,并进行用户定义; 通过两个示例说明如何进行 Spring Security 用户定义。 下面,我们将逐一进行讲解。 一、Spring Security 用户定…

    Java 2023年6月3日
    00
  • Spring Boot应用程序中如何使用Keycloak详解

    使用Keycloak是为应用程序添加身份验证和授权的一种流行方式。Spring Boot提供了一个快速简便的方式整合Keycloak。本文将会以实例的方式介绍如何在Spring Boot应用程序中使用Keycloak。 准备工作 在开始使用Keycloak前,需要进行以下准备工作: 安装Java SDK和Maven 下载和安装Keycloak 创建Keycl…

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