Java Spring AOP详解

Java Spring AOP详解

什么是 AOP

AOP (Aspect-Oriented Programming) 是一种编程思想,它将程序模块化分成维护和开发,可以让我们专注于业务逻辑处理,解决了代码耦合、代码重复等问题。

AOP 的原理就是通过将特性从业务逻辑中分离出来,在运行时动态地将它们与适当的程序节点关联起来。

AOP 的优点

AOP 为项目带来了许多优点,如下:

  • 代码重复性降低:通过将特性抽象出来,避免重复代码的产生,从而提高应用程序的可重用性并简化代码。
  • 可维护性增强:把业务逻辑与特性分离,大大减少了代码的耦合性和难度,让代码更加容易维护。
  • 代码集中:通过划分组件,降低了业务逻辑的复杂性,让代码更好的集中在业务逻辑上。
  • 程序员可以集中精力于业务逻辑中,不会被一些实现细节所干扰,提高开发效率。

Spring AOP 的实现

Spring AOP 实现了规范的 AOP 开发接口,支持 环绕增强,方法前增强,方法后增强和异常抛出增强等,同时,Spring AOP还通过各种 AOP术语来完整 阐述了 AOP 的全部实现。

提到 Spring AOP 那便不得不说它的核心接口和核心实现类,这也是使用 AOP 实现特性的关键类。

在引入 Spring AOP 的情况下,我们需要了解以下接口以及类:

  • Advice
  • JoinPoint
  • AspectJ pointcut
  • Advisor
  • PointcutAdvisor

Advice

Advice 是 Spring AOP 的增强接口,Spring AOP 支持 5 种类型的 Advice,具体如下:

  • Before advice
  • After returning advice
  • After throwing advice
  • After advice
  • Around advice

Advice 类提供了 AOP 中执行的通知,可以在指定时间点织入被增强对象的代码,是 Spring AOP 进行 AOP 增强的关键。

JoinPoint

JoinPoint 是 AOP 需要封装的关键。除了被建议的对象,JoinPoint 声明还包含被增强方法的信息,例如签名和参数。

AspectJ pointcut

Pointcut 不同于 JoinPoint,Pointcut 更细粒度,它只代表着需要增强的代码位置,即程序把代码块传递给 Advice,告诉它要织入什么样的代码。

@Pointcut("com.test.model.assembler.profile.ProfileAssembler.createProfile")
public void createProfile() {}

Advisor

Advisor 是 Spring AOP 中一个重要的抽象类,提供了 Advice 与 Pointcut 的关联。

PointcutAdvisor

Spring 框架提供了另外一种类型的 Advisor,即 PointcutAdvisor,它与 Advisor 的区别在于它的 Advice 语句必须基于 Pointcut 的表达式,而 Advisor 可以独立地封装 Advice 和 Pointcut。

以上是 Spring AOP 的一些主要概念,下面我们通过示例来更好地理解 Spring AOP。

示例1:冰淇淋销售

通过这个示例,我们来看下 Spring AOP 前置增强的实现

public class IceCreamSeller{

    public void sellIceCream( String name ){

        System.out.println("今天的日推是 " + name + "口味的冰激凌");
    } 

}

public class SellerAdvice implements MethodBeforeAdvice{

    @Override
    public void before(Method method, Object[] args, Object target){
        System.out.println("每位客人可以多尝试几种口味哦!");  
    }
}

ApplicationContext context = new ClassPathXmlApplicationContext("ApplicationContext.xml");
IceCreamSeller iceCreamSeller = (IceCreamSeller) context.getBean("iceCreamSeller"); 
SellerAdvice sellerAdvice = (SellerAdvice) context.getBean("sellerAdvice"); 
ProxyFactory proxyFactory = new ProxyFactory();
proxyFactory.setTarget(iceCreamSeller); 
proxyFactory.addAdvice(sellerAdvice); 
IceCreamSeller iceCreamSellerProxy = (IceCreamSeller) proxyFactory.getProxy();

iceCreamSellerProxy.sellIceCream("荔枝");

上述代码中,IceCreamSeller 类是我们要增加代码的类,SellerAdvice 类是 Spring AOP 前置增强实现的类。通过 ApplicationContext 构建实例,通过 ProxyFactory 添加想增强的类和 Advice,最后通过 getProxy() 获取动态代理对象并调用增强方法。

示例2:冰淇淋促销

通过这个示例,我们来看下 Spring AOP 后置增强的实现。

public class IceCreamSeller {

    public void sale(String flavor) {
         System.out.println("销售 " + flavor + " 口味的冰淇淋");
    }
}

public class After implements AfterReturningAdvice{
    @Override
    public void afterReturning(Object returnValue, Method method, Object[] args, Object target)
            throws Throwable {
        System.out.println("买 " + returnValue + " 送一罐可乐哦");
    }
}

ApplicationContext context = new ClassPathXmlApplicationContext("ApplicationContext.xml");
IceCreamSeller iceCreamSeller = (IceCreamSeller) context.getBean("iceCreamSeller"); 
After after = (After) context.getBean("after"); 

ProxyFactory proxyFactory = new ProxyFactory();
proxyFactory.setTarget(iceCreamSeller);
proxyFactory.addAdvice(after);

IceCreamSeller proxy = (IceCreamSeller) proxyFactory.getProxy();
proxy.sale("荔枝");

上述例子中,After 类是 Spring AOP 后置增强的类,代码中我们通过 AfterReturningAdvice 把增强的代码写入了 afterReturning() 方法中,程序执行后会输出 买 荔枝 送一罐可乐哦

总结

Spring AOP 提供的增强机制为开发者进行更高节奏、更高效率的编程,而它背后的实现逻辑也并不算是特别复杂。 通过以上示例,我们了解了 Spring AOP 的特性和底层实现,相信大家都对 Spring AOP 的实现有了更深入的理解。

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

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

相关文章

  • JDK动态代理之ProxyGenerator生成代理类的字节码文件解析

    关于“JDK动态代理之ProxyGenerator生成代理类的字节码文件解析”的攻略,我将分为以下几步进行讲解: 简介和背景知识 ProxyGenerator的介绍 通过实例了解ProxyGenerator的核心方法 示例1:使用ProxyGenerator生成代理类的字节码文件 示例2:通过反编译工具解析代理类的结构 总结 接下来,我将逐一进行讲解。 1.…

    Java 2023年5月26日
    00
  • Springboot+SpringSecurity+JWT实现用户登录和权限认证示例

    让我为您详细讲解一下“Springboot+SpringSecurity+JWT实现用户登录和权限认证示例”的攻略。 首先,需要安装以下工具: Java开发环境 Maven构建工具 然后,我们需要按照以下步骤进行实现: 1.添加依赖 在pom.xml文件中添加以下依赖: <dependency> <groupId>org.spring…

    Java 2023年5月20日
    00
  • Mybatis的详细使用教程

    Mybatis是一款流行、轻量级的Java持久化框架,它的使用方式简单、灵活,适用于各种复杂的数据访问场景。下面是Mybatis的详细使用教程: 1. 环境搭建 要使用Mybatis,首先需要搭建运行环境,并添加相应的依赖项。假设我们使用Maven管理项目依赖,可以在 pom.xml 文件中添加如下依赖: <dependency> <gro…

    Java 2023年5月20日
    00
  • SpringBoot中的Mybatis依赖问题

    一、问题描述 在使用SpringBoot框架时,如果想要使用Mybatis进行数据库访问,通常会在pom.xml文件中添加对应的依赖。然而,有时候在添加依赖后,会遇到依赖冲突、版本不兼容等问题,导致项目无法正常启动或编译。那么,如何解决这些依赖问题呢? 二、解决方法 1.排查依赖冲突 首先,我们需要确定是否是因为依赖冲突导致的问题。我们可以通过查看maven…

    Java 2023年5月20日
    00
  • 5分钟快速创建spring boot项目的完整步骤

    下面我将为您详细讲解“5分钟快速创建springboot项目的完整步骤”的攻略: 确定项目名称及配置环境 在开发机器上安装并配置好Java的环境变量及相关依赖。 确定项目的名称和描述。如“hello-world-springboot”。 打开网址https://start.spring.io/。这是官方提供的springboot项目生成器,可以方便地帮助我们…

    Java 2023年5月15日
    00
  • JVM的垃圾回收算法工作原理详解

    JVM的垃圾回收算法工作原理详解 什么是垃圾回收? 垃圾回收是指自动管理程序中动态分配的内存的过程。在垃圾回收的过程中,垃圾收集器会扫描程序中的内存,查找出无用的对象,然后将它们的内存空间释放掉。这样就可以避免内存泄漏和程序崩溃。 垃圾回收算法 垃圾回收算法的目标是找出内存中无用的对象,然后回收这些对象所占用的内存空间。JVM采用的主要的垃圾回收算法有标记-…

    Java 2023年5月19日
    00
  • Java特性 Lambda 表达式和函数式接口

    Java 8 引入了 lambda 表达式和函数式接口,是 Java 语言中一个重要的特性。本文将介绍 lambda 表达式和函数式接口的基本概念和语法,并分别举出两个示例来说明如何使用它们。 什么是 Lambda 表达式 Lambda 表达式是一种语法糖,它允许我们直接以内联方式为一个函数赋值,即在不创建单独的方法的情况下,使用表达式创建匿名函数,并将其传…

    Java 2023年5月26日
    00
  • SpringBoot创建并简单使用的实现

    下面我会给出一份详细的Spring Boot创建并简单使用的攻略,包含以下几个部分: 环境准备 创建Spring Boot项目 使用Spring Boot 示例1:创建RESTful API 示例2:集成Thymeleaf模板引擎 环境准备 在开始创建Spring Boot项目之前,需要进行相关的环境准备。首先,需要确保你已经安装了Java和Maven,在安…

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