java开发AOP面向切面编程入门

Java AOP面向切面编程入门攻略

什么是AOP编程

AOP(AspectOriented Programming),即面向切面编程,是OOP编程模式的一种补充。AOP编程是通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。

在传统的OOP编程中,我们将所有重复出现的代码封装到相应的模块或类中,实现代码复用。通过继承或组合等方式,可以将这些模块或类组装成一个完整的系统。但是,当有新的需求或变化时,这些相同的代码需要在每个模块或类中进行修改,工作量非常大,不利于维护和扩展。

而AOP编程可以将横切关注点(如日志、事务等)从各个模块中分离出来,通过将这些关注点动态地织入到程序代码中来统一维护,从而实现程序功能的复用和统一维护,降低了代码的耦合性。

AOP的核心概念

切点(Pointcut)

切点是指我们要处理的目标类或方法。对于每一个切点,都会定义一个相应的切面(Aspect)。

切点可以使用类名、方法名等方式来定义。常见的切点表达式如下:

  • execution:表示满足指定规则的方法执行时。例如,execution(* com.example.service..*.*(..))表示com.example.service包及其子包下的所有方法都符合该切点表达式。
  • within:表示在满足指定规则的类型内部。例如,within(com.example.service.*)表示所有com.example.service包下的类及子类都符合该切点表达式。
  • annotation:表示满足指定规则的注解标注的方法执行时。例如,@annotation(org.springframework.transaction.annotation.Transactional)表示使用了@Transactional注解的方法都符合该切点表达式。

通知(Advice)

通知是指在切点中需要执行的代码。在AOP中,一个切面包含了一个或多个通知。

通知的类型如下:

  • 前置通知(Before advice):在目标方法执行前执行。
  • 后置通知(After advice):在目标方法执行后执行,无论是否抛出异常,都执行。
  • 返回通知(AfterReturning advice):在目标方法执行后执行,只有在方法正常完成时才执行。
  • 异常通知(AfterThrowing advice):在目标方法抛出异常后执行。
  • 环绕通知(Around advice):在目标方法执行前和执行后都会执行。

切面(Aspect)

切面是横切关注点的实现。它包含了一个切点和一个或多个通知。

在AOP中,我们可以开发多个切面,每个切面都拥有自己的通知,而同一个切点也可以有多个切面。

AOP开发示例1:简单的日志记录器

下面是一个简单的用于记录日志的切面。

@Aspect
@Component
public class LogAspect {

    // 定义一个切点,表示com.example.service包及其子包下的所有方法
    @Pointcut("execution(* com.example.service..*.*(..))")
    public void serviceLog() {}

    // 在目标方法执行前记录日志
    @Before("serviceLog()")
    public void doBefore(JoinPoint joinPoint) {
        // 获取目标方法名
        String methodName = joinPoint.getSignature().getName();
        // 获取目标类名
        String className = joinPoint.getTarget().getClass().getName();
        // 构造日志消息
        String logMsg = "开始执行 " + className + "." + methodName;
        // 记录日志
        System.out.println(logMsg);
    }

    // 在目标方法执行后记录日志
    @AfterReturning("serviceLog()")
    public void doAfterReturning(JoinPoint joinPoint) {
        // 获取目标方法名
        String methodName = joinPoint.getSignature().getName();
        // 获取目标类名
        String className = joinPoint.getTarget().getClass().getName();
        // 构造日志消息
        String logMsg = "执行完成 " + className + "." + methodName;
        // 记录日志
        System.out.println(logMsg);
    }
}

在以上代码中:

  • @Aspect注解表示该类是一个切面。
  • @Component注解表示该类是一个Spring组件,可以被自动注入到其他组件中。
  • @Pointcut注解表示定义了一个切点,即com.example.service包及其子包下的所有方法。
  • @Before和@AfterReturning注解分别表示前置和后置通知,用于在目标方法执行前和执行后记录日志。

AOP开发示例2:传递参数

下面是一个用于判断用户是否有权限的切面,它传递了一个参数。

@Aspect
@Component
public class PermissionAspect {

    // 定义一个切点,表示需要权限控制
    @Pointcut("@annotation(com.example.annotation.Permission)")
    public void permissionCheck() {}

    // 在目标方法执行前进行权限判断
    @Before("permissionCheck() && @annotation(permission)")
    public void checkPermission(JoinPoint joinPoint, Permission permission) {
        // 获取请求参数
        Object[] args = joinPoint.getArgs();
        if(args.length == 0) {
            throw new PermissionDeniedException("请求参数为空!");
        }
        String userId = (String) args[0];

        // 判断用户权限
        if(!permission.value().contains(userId)) {
            throw new PermissionDeniedException("您没有权限访问该接口!");
        }
    }
}

在以上代码中:

  • @annotation(permission)表示获取注解中的value值,即授权列表。
  • joinPoint.getArgs()方法获取目标方法的参数列表。

结束语

以上就是AOP入门攻略以及两个示例。AOP虽然能够提升代码的复用性和可维护性,但也会增加代码的复杂度,所以在使用AOP时,需要谨慎选择切点和通知的类型,以便在保证代码可读性的前提下,发挥AOP的优势。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java开发AOP面向切面编程入门 - Python技术站

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

相关文章

  • java实现抖音代码舞源码

    Java实现抖音代码舞源码的攻略,可分为以下步骤: 1. 获取抖音视频 首先需要获取抖音视频,可以通过解析抖音分享链接来获取。可以使用Java中的网络爬虫技术,发送GET请求获取页面源代码,然后通过正则表达式或Jsoup等HTML解析器解析页面元素,获取视频链接。 以下是一个示例代码段,通过Jsoup获取某个抖音分享链接页面中的视频链接。 import or…

    Java 2023年5月19日
    00
  • 详解Spring Boot 目录文件结构

    下面是详解Spring Boot目录文件结构的攻略。 目录文件结构 作为一款快速构建Java Web应用的框架,Spring Boot提供了一套默认的目录结构,旨在帮助开发人员快速搭建应用并进行开发,其目录文件结构如下: project ├── src/main/java │ └── com/example/demo │ ├── controller │ ├…

    Java 2023年5月15日
    00
  • Java Apache POI报错“OldExcelFormatException”的原因与解决办法

    “OldExcelFormatException”是Java的Apache POI类库中的一个异常,通常由以下原因之一引起: 文件格式错误:如果文件不是Excel 2007或更高版本的.xlsx格式,则可能会出现异常。例如,可能会尝试读取旧版的Microsoft Excel文件或尝试读取其他文件类型。 以下是两个实例: 例1 文件格式错误,则可以尝试使用正确…

    Java 2023年5月5日
    00
  • SpringBoot 监控管理模块actuator没有权限的问题解决方法

    我来为您详细讲解“SpringBoot 监控管理模块actuator没有权限的问题解决方法”的完整攻略。 问题描述 在使用 SpringBoot 监控管理模块 actuator 时,可能会遇到没有权限的问题,例如访问 http://localhost:8080/actuator 时出现 {“timestamp”:”2021-07-28T12:34:56.78…

    Java 2023年5月20日
    00
  • java读取XML文件的四种方法总结(必看篇)

    下面是针对“java读取XML文件的四种方法总结(必看篇)”这篇攻略的详细讲解。 提供四种方法 该攻略提供了使用Java读取XML文件的四种方法,分别是: 使用SAX方式解析XML文件 使用DOM方式解析XML文件 使用JDOM方式解析XML文件 使用XMLBeans方式解析XML文件 对于每种方法,攻略都提供了详细的介绍和示例代码,并且针对各种场景,推荐了…

    Java 2023年5月20日
    00
  • 如何优雅的处理异常

    作者:京东零售  秦浩然 一、什么是异常 Java 语言按照错误严重性,从 throwale 根类衍生出 Error 和 Exception 两大派系。 Error(错误): 程序在执行过程中所遇到的硬件或操作系统的错误。错误对程序而言是致命的,将导致程序无法运行。常见的错误有内存溢出,jvm 虚拟机自身的非正常运行,calss 文件没有主方法。程序本生是不…

    Java 2023年4月25日
    00
  • spring boot集成pagehelper(两种方式)

    下面我会详细讲解Spring Boot集成PageHelper的两种方式及相应的示例。 方式一:使用PageHelper Starter 第一步:在pom.xml文件中添加以下依赖: <dependency> <groupId>com.github.pagehelper</groupId> <artifactId&g…

    Java 2023年5月19日
    00
  • mysql connector 执行 select 和 shardingshpere-proxy 的处理过程

    use java mysql connector // fake mysql select code // … datasource init Connection conn = datasource.getConnection(); PreparedStatement pst = conn.prepareStatement(“select id, ta…

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