Spring超详细讲解AOP面向切面

Spring超详细讲解AOP面向切面

什么是 AOP?

AOP(Aspect-Oriented Programming)面向切面编程,主要解决了OOP(Object-Oriented Programming)面向对象编程中的一些交叉问题。AOP使程序员能够将类似的功能从不同的对象中抽象出来,然后统一在一个位置进行管理和维护。AOP 所提供的机制被称为 "横切关注点"(Cross-cutting Concerns)。

AOP中的重要概念

  • 切面(Aspect):横切关注点的模块化,第一个步骤是定义一个切面来包含那些横切关注点。

  • 通知(Advice):定义了切面是在什么时候、何地被执行的方法;将于切点相应的通知类型属于以下几种:前置通知、后置通知、异常通知、环绕通知和最终通知。

  • 切点(Pointcut):其定义相当于切面接口的实现,即确定在哪里对应用程序进行拦截;类中有哪些方法会作为连接点,连接点在Aspect中会被标记,并应用通知。

  • 连接点(Joinpoint):程序执行过程中明确的点。

  • 织入(Weaving):织入是把增强(即通知)应用到目标对象并创建新的代理对象的过程。

Spring 中的 AOP

Spring AOP 提供了所有基于代理的 AOP 框架中最丰富的功能。在Spring中,AOP可以通过编程方式或者申明式设置。

编程方式

通常情况下,切面通过编写一个普通的Java类并在类中使用注解来完成定义。然后通过创建一个拦截类注册到IoC容器中来激活这个注解。其中,定义实现MethodInterceptor接口,然后注册到IoC容器中。

下面我们来举一个使用注解来配置 AOP 的简单示例。假设我们要定义一个日志切面,在所有方法调用前和调用后记录方法名、参数、返回值和执行时间。

@Aspect
public class LogAspect {
    private Logger log = LoggerFactory.getLogger(LogAspect.class);

    @Around("execution(* com.example.service.impl.*.*(..))")
    public Object log(ProceedingJoinPoint point) throws Throwable {
        String methodName = point.getSignature().getName();
        Object[] args = point.getArgs();
        Object target = point.getTarget();

        log.info("调用" + target.getClass().getSimpleName() + "的" + methodName + "方法,参数为" + Arrays.toString(args));
        long startTime = System.currentTimeMillis();
        Object result = point.proceed();
        long endTime = System.currentTimeMillis();

        log.info("调用" + target.getClass().getSimpleName() + "的" + methodName + "方法,返回值为" + result + ""+ ",耗时:" + (endTime - startTime) + "ms");
        return result;
    }
}

上面的代码中,我们使用了 @Aspect 注解来定义一个切面,指定了 @Around 注解来表示这是一个环绕通知,切点表达式使用 execution(* com.example.service.impl.*.*(..)) 来指定切点为 com.example.service.impl 包下所有方法。

申明式设置

申明式是使用 XML 文件进行配置。下面是一个使用申明式定义 AOP 的简单示例,与前面的注解示例实现同样的功能。

<bean id="logAspect" class="com.example.aop.LogAspect"/>

<aop:config>
    <aop:aspect ref="logAspect">
        <aop:pointcut id="service" expression="execution(* com.example.service.impl.*.*(..))"/>
        <aop:around method="log" pointcut-ref="service"/>
    </aop:aspect>
</aop:config>

上面的代码中,我们创建了一个名为 logAspect 的切面,定义了一个切点 service,使用 execution(* com.example.service.impl.*.*(..)) 来指定切点为 com.example.service.impl 包下所有方法。最后通过 around 元素将 log 方法和 service 切点关联起来。

总结

AOP 的使用可以在一定程度上增强了设计的灵活性、封装性和代码的重用性和可维护性。Spring框架通过定义一个切面,将业务逻辑和系统服务分离,极大地提高了代码的可维护性。

两个示例已经涉及了面向切面的方法,通过编程方式和声明式两种方式来实现,以此方便开发者使用。

还有其余内容需要补充,欢迎读者根据实际需求查看相关文档资料。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Spring超详细讲解AOP面向切面 - Python技术站

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

相关文章

  • 解决Java程序使用MySQL时返回参数为乱码的示例教程

    下面我来详细讲解如何解决Java程序使用MySQL时返回参数为乱码的问题。 问题描述: 当Java程序连接MySQL数据库时,如果返回的参数为乱码,而不是预期的中文或其他语言,那么这就是一个常见的问题。 解决方案: 解决该问题的方法有很多,下面我们来了解其中两个示例方法。 方法一:设置MySQL数据库的字符集为utf8mb4 打开MySQL客户端,执行以下命…

    html 2023年5月31日
    00
  • XML到Java代码的数据绑定之对象

    关于“XML到Java代码的数据绑定之对象”的完整攻略,我先来讲一下XML是什么,Java代码是什么,数据绑定是什么: XML(可扩展标记语言)是一种常用的数据格式,可以用来描述结构化的数据,比如说我们可以使用XML来存储网站的数据或者配置参数。 Java代码是一种编程语言,用于开发应用程序和互联网应用。 数据绑定是将一种数据格式(比如XML)与另一种数据格…

    html 2023年5月30日
    00
  • 计算机中的字符串编码、乱码、BOM等问题详解

    计算机中的字符串编码、乱码、BOM等问题详解 字符编码的概念 计算机中的字符本质上是一个数字,用来表示各种相应的字符,例如字母、数字、符号、汉字等等。这个数字就是字符编码。 在计算机领域,常见的字符编码有ASCII、GB2312、GBK、UTF-8等,它们都有不同的编码规则和代表字符的范围,例如ASCII编码只能表示英文和基本符号。 乱码的原因 当使用不同的…

    html 2023年5月31日
    00
  • web.xml详解_动力节点Java学院整理

    为了更好地理解Web应用程序的配置和部署过程,Java开发者通常使用配置文件,其中最重要的是Web应用程序的配置文件web.xml。本文将详细讲解web.xml文件的各个部分及其用途,以及如何使用它来配置Web应用程序。 什么是web.xml文件? 在Java Web应用程序中,web.xml文件是一个用于配置Servlet,Filter和Listener的…

    html 2023年5月30日
    00
  • mybatis in查询传入String方式

    使用MyBatis的in查询,可以在SQL中使用in关键字,实现查询某个字段是否在指定的值列表中。在MyBatis中,使用in查询有多种方式,其中一种需要传入字符串,下面我们来详细讲解该方式的攻略。 1. 在Mapper.xml中编写SQL 在Mapper.xml文件中,可以先定义一个对应的SQL语句,如下所示: <select id="se…

    html 2023年5月30日
    00
  • 抖音黄字怎么弄?抖音黄色评论输入方法

    抖音黄字怎么弄?抖音黄色评论输入方法 抖音黄字是一种在评论中添加黄色字体的方法,以下是抖音黄色评论输入方法的详细攻略: 步骤1:打开抖音 在手机上打开抖音应用程序。 步骤2:进入评论区 在抖音中找到您想要评论的视频,然后单击评论图标进入评论区。 步骤3:输入黄色字体 在评论框中输入“&#[FFD5]”(不包括引号)。 在“&#[FFD5]”后…

    html 2023年5月17日
    00
  • DIV常用属性大全自己整理

    DIV常用属性大全自己整理 DIV概述 DIV是HTML中最基本的结构化标签,用于对HTML页面进行布局。之所以常用是因为DIV可以轻松的实现元素的定位、居中、布局等功能。 DIV常用属性 下面是DIV常用的属性,可以通过设置这些属性来实现元素的布局、样式、动态效果。 布局相关属性 width:设置元素的宽度。 height:设置元素的高度。 margin:…

    html 2023年5月30日
    00
  • 浅谈springboot中tk.mapper代码生成器的用法说明

    浅谈Spring Boot中 tk.mapper 代码生成器的用法说明 介绍 Spring Boot 是一个十分流行的 Java Web 开发框架,它简化了很多传统 java web 开发的繁琐步骤,让开发人员快速构建高效的 Web 应用。如果你使用 Spring Boot 作为你的项目框架,那么你可能需要使用 tk.mapper 代码生成器来生成 MyBa…

    html 2023年5月30日
    00
合作推广
合作推广
分享本页
返回顶部