Java aop面向切面编程(aspectJweaver)案例详解

yizhihongxing

Java AOP面向切面编程(AspectJ Weaver)案例详解

什么是AOP?

AOP全称Aspect-Oriented Programming,即面向切面编程。它是一种基于OOP(Object-Oriented Programming,面向对象编程)的编程思想,用于解决模块化开发中横切关注点的问题,以通过对横切关注点进行抽象,实现系统各模块之间的解耦。

AOP中的概念

  • 切面(Aspect):一个关注点的模块化,这个关注点可能会横切多个对象,切面可以应用到多个对象上。
  • 连接点(Joinpoint):程序执行过程中明确的点,通常是方法的调用。
  • 通知(Advice):在特定的连接点上执行的增强处理,有before、after、around等不同类型。
  • 切入点(Pointcut):用于定义通知(Advice)被触发的连接点。
  • 引入(Introduction):在不修改类代码的前提下,引入新的接口。

AspectJ Weaver

AspectJ是AOP思想的实现框架之一,它提供了很多AOP的解决方案,并且使用起来比较方便。AspectJ Weaver是AspectJ工具集中的一个编译器,可以将AspectJ语言编写的切面加入到Java字节码文件中,AspectJ编译器会根据AspectJ语言编写的切面来增强Java字节码文件中的目标对象。

AspectJ Weaver案例详解

下面通过两个案例来详细讲解AspectJ Weaver的使用。

示例1:记录方法执行时间

我们通过AOP来记录方法的执行时间,以方便进行性能调优。我们可以使用AspectJ Weaver来实现,代码如下:

我们首先需要导入AspectJ Weaver依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjweaver</artifactId>
</dependency>

然后定义一个切面(Aspect)类,用于在方法调用前和调用后记录时间:

@Aspect
@Component
public class TimeAspect {

    private static final Logger LOGGER = LoggerFactory.getLogger(TimeAspect.class);

    @Around("execution(* com.example.demo.*.*(..))")
    public Object timeAround(ProceedingJoinPoint joinPoint) throws Throwable {
        long startTime = System.currentTimeMillis();
        Object result = joinPoint.proceed();
        long endTime = System.currentTimeMillis();
        LOGGER.info("Method {} cost {}ms.", joinPoint.getSignature().getName(), endTime - startTime);
        return result;
    }
}

在上述代码中,@Aspect注解表明该类是一个切面类,@Around注解表示在目标方法执行前和执行后会执行这个方法,execution表达式代表切入点,即要拦截哪些方法。

最后,在应用程序启动时,Spring会自动将切面注入到目标对象中,最终程序执行时会在记录方法执行时间。

示例2:缓存数据

我们通过AOP来实现数据的缓存,以提升程序的执行效率。代码实现如下:

在pom.xml文件中添加如下依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjweaver</artifactId>
</dependency>
<dependency>
    <groupId>com.github.ben-manes.caffeine</groupId>
    <artifactId>caffeine</artifactId>
    <version>2.8.8</version>
</dependency>

然后我们定义一个缓存切面类,用于缓存数据:

@Aspect
@Component
public class CacheAspect {

    private static final Logger LOGGER = LoggerFactory.getLogger(CacheAspect.class);

    // 创建Caffeine缓存对象
    private static final Cache<String, Object> CACHE = Caffeine.newBuilder()
            .expireAfterWrite(30, TimeUnit.SECONDS)
            .maximumSize(1000)
            .build();

    @Around("execution(* com.example.demo.UserServiceImpl.find*(..))")
    public Object findUserCache(ProceedingJoinPoint joinPoint) {
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        String methodName = signature.getName();
        Object[] args = joinPoint.getArgs();

        // 根据方法名和参数拼接Key
        StringBuilder sb = new StringBuilder();
        sb.append(methodName);
        for (Object arg : args) {
            sb.append(arg);
        }
        String key = sb.toString();

        // 判断缓存中是否存在
        Object result = CACHE.getIfPresent(key);
        if (result != null) {
            LOGGER.info("Method from cache, method:{} key:{}", methodName, key);
            return result;
        }

        try {
            LOGGER.info("Method from db, method:{} key:{}", methodName, key);
            // 缓存中不存在,从数据库查询
            result = joinPoint.proceed();

            // 将查询结果添加到缓存中
            CACHE.put(key, result);
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }

        return result;
    }

}

在上述代码中,我们使用Caffeine缓存库创建了一个缓存对象,然后在@Around注解中定义了拦截的方法,通过方法名和参数拼接Key,判断是否存在缓存,如果存在直接返回缓存结果。如果缓存中不存在对应数据,则查询数据库并将结果添加到缓存中。

总结

通过上述示例,我们可以看到使用AspectJ Weaver进行AOP编程比较简单,可以方便地在Java类中增强逻辑。我们在实际项目中也可以灵活地应用AOP技术,提升程序效率和可维护性。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java aop面向切面编程(aspectJweaver)案例详解 - Python技术站

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

相关文章

  • 本地方法栈的作用是什么?

    本地方法栈(Native Method Stack)是Java虚拟机中的一块内存区域,用于存储本地方法的参数、返回值和局部变量等信息。本地方法是指使用本地语言(如C或C++)编写的方法,可以通过Java Native Interface(JNI)调用。本地方法栈是线程私有的,每个线程都有自己的本地方法栈。本地方法栈的大小可以通过虚拟机参数-Xss进行设置。 …

    Java 2023年5月12日
    00
  • Java策略模式的简单应用实现方法

    接下来我会详细讲解“Java策略模式的简单应用实现方法”的完整攻略。 什么是策略模式? 策略模式是一种行为型设计模式,它允许你定义一组算法,将每个算法都封装起来,并使它们之间可以互换。该模式让算法的变化独立于使用它们的客户端,即可以在不修改客户端代码的情况下更换执行算法。 策略模式的应用场景 当需要在不同情况下使用不同的算法时,可以使用策略模式,将每种算法都…

    Java 2023年5月26日
    00
  • java(jsp)整合discuz同步登录功能详解

    下面是详细讲解“java(jsp)整合discuz同步登录功能详解”的攻略。 介绍 Discuz是一个比较古老的论坛系统,它有很多的功能以及插件,而且也有很多网站在使用它。如果你已经有了一个成熟的Java Web网站,那么也许你希望这个网站能够跟Discuz集成起来,实现同步登录的功能。这篇攻略将介绍如何实现Java Web和Discuz之间的同步登录功能。…

    Java 2023年6月15日
    00
  • 浅谈Java中Lambda表达式的相关操作

    浅谈Java中Lambda表达式的相关操作 什么是Lambda表达式 Lambda表达式是Java8中引入的一种新特性,它允许我们以更简洁的方式定义单个抽象方法的接口,从而使得代码更加简洁易读。Lambda表达式可以看作是一种匿名函数,它可以像对象一样传递,并且支持在集合框架中进行高效的过滤和变换。 Lambda表达式的基本语法 Lambda表达式的语法由”…

    Java 2023年5月26日
    00
  • Java SpringBoot项目如何优雅的实现操作日志记录

    针对Java SpringBoot项目实现操作日志记录的攻略,主要包括以下几个方面: 一、使用AOP切面编程实现日志记录 AOP切面编程是Java Spring框架中的重要特性之一,通过定义切面和切入点,可以在程序中对方法进行增强,实现各个方面的统一处理。在日志记录方面,可以通过定义切面,对所有需要记录日志的方法进行切入。 创建自定义注解 首先,我们需要定义…

    Java 2023年5月19日
    00
  • SpringCloud2020版本配置与环境搭建教程详解

    SpringCloud 2020版本配置与环境搭建教程详解 简介 Spring Cloud 作为微服务框架之一,在微服务架构中扮演着重要角色。本文将介绍Spring Cloud 2020版本的环境搭建教程,帮助你搭建基于Spring Cloud微服务架构的项目。 步骤 1. 准备环境 首先需要准备以下环境: JDK 1.8+ Maven IDE(推荐使用In…

    Java 2023年5月20日
    00
  • Spring Security自定义认证器的实现代码

    下面我将详细讲解关于Spring Security自定义认证器的实现代码的攻略。 第一步:创建一个自定义的认证器类 在Spring Security中,自定义的认证器需要继承AbstractAuthenticationProcessingFilter类,实现其中的attemptAuthentication方法,该方法用于对用户提交的认证请求进行身份认证。 我…

    Java 2023年6月3日
    00
  • Java SpringBoot的相关知识点详解

    Java Spring Boot 的相关知识点详解 一、什么是 Spring Boot? Spring Boot 是一个基于 Spring 框架的快速 Web 应用开发工具,它能够快速构建可部署的、独立的、生产级别的应用程序。相对于传统的 Spring 框架,Spring Boot 更加轻量级,具有更好的开发效率。 二、Spring Boot 的优势和功能 …

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