首页 > 其他分享 >Spring:Spring AOP的高级用法

Spring:Spring AOP的高级用法

时间:2024-09-27 16:23:18浏览次数:11  
标签:匹配 Spring 用法 切面 AOP execution public

一、前言

  Spring AOP(面向切面编程)是一种强大的范式,用于模块化应用程序中的横切关注点。切入点(Pointcut)是一组一个或多个连接点(Join Point)的集合,在这些连接点上应该应用通知(Advice)。连接点是程序执行过程中的一个点,比如方法执行、对象实例化或字段访问。切入点定义了通知执行的时机和位置。

二、基本概念

  切面(Aspect):切面是跨越多个类和对象关注点的模块化,如日志记录、事务管理等。在Spring AOP中,切面可以使用基于注解或XML的方式定义。

  连接点(Joinpoint):程序执行过程中的一个点,如方法的执行或异常的处理。在Spring AOP中,连接点通常指的是方法的执行。

  切入点(Pointcut):用于定义哪些连接点(即哪些方法)会被切面增强。切入点表达式决定了哪些类的哪些方法会被拦截。

  通知(Advice):在切面的某个特定连接点上执行的动作。Spring AOP支持五种类型的通知:前置通知、后置通知(返回后)、环绕通知、异常通知和最终通知。

  代理(Proxy):Spring AOP通过代理机制实现切面功能。根据目标对象是否实现接口,Spring AOP会选择使用JDK动态代理或CGLIB代理。

三、高级用法

1. 复杂的切入点表达式
  Spring AOP使用AspectJ切入点表达式语言来定义切入点。除了基本的执行表达式(execution)外,还支持within、this、target、args、@target、@within、@annotation等多种类型的表达式,用于更精确地匹配连接点。

execution基本用法

execution(* com.pack.UserService.*(..))匹配指定包和类中的所有方法

execution(*UserService.*(..))匹配同一包和指定类中的所有方法

execution(public *UserService.*(..))匹配UserService中的所有公共方法

execution(public UserUserService.*(..))匹配UserService中所有返回类型为 User 对象的公共方法

execution(public UserUserService.*(User, ..))匹配UserService中所有返回类型为 User 且第一个参数为 User 的公共方法

execution(public UserUserService.*(User, Integer)) 匹配UserService中所有返回类型为 User 且带有指定参数的公共方法

高级用法within()

可以指定某一类型或包中的连接点

within(com.pack.service.*) 该表达式匹配"com.pack.service"包中的所有方法。

within(com.pack..*)匹配包"com.pack"中所有类的所有方法,以及所有子包中的类

within(com.pack.UserService)匹配指定包中指定类的所有方法

within(UserService)匹配当前包中指定类的所有方法

within(IUserService+)匹配指定接口所有实现中的所有方法

bean表达式

匹配所有符合指定模式的类中的所有方法

bean(*Service)匹配 bean 中名称以 "Service"结尾的所有方法

bean(userService)匹配指定 Bean 中名称为 "userService "的所有方法

bean(com.pack.service.*)匹配特定包中所有bean的所有方法

bean(@PackAnnotation *)将所有 Bean 中的所有方法与特定注解相匹配

2. @Aspect顺序

  当存在多个切面时,这些切面可能会同时对同一个方法进行增强操作。为了控制这些切面的执行顺序,可以使用@Order注解来指定它们的优先级。数值越小的切面具有更高的优先级,即会先执行。

代码示例

import org.aspectj.lang.annotation.Aspect;  
import org.aspectj.lang.annotation.Before;  
import org.springframework.core.annotation.Order;  
  
@Aspect  
@Order(value = 1) // 指定FirstAspect的优先级为1  
public class FirstAspect {  
  
    @Before("execution(* com.example.service.*.*(..))")  
    public void beforeAdvice() {  
        System.out.println("First aspect executed before method execution");  
    }  
}  
  
@Aspect  
@Order(value = 2) // 指定SecondAspect的优先级为2,因此会在FirstAspect之后执行  
public class SecondAspect {  
  
    @Before("execution(* com.example.service.*.*(..))")  
    public void beforeAdvice() {  
        System.out.println("Second aspect executed before method execution");  
    }  
}

  除了使用@Order注解外,还可以通过实现Ordered接口并覆盖getOrder()方法来指定顺序。但在Spring 4.0及更高版本中,推荐使用@Order注解,因为它更加简洁易用。

代码示例

import org.aspectj.lang.annotation.Aspect;  
import org.aspectj.lang.annotation.Before;  
import org.springframework.core.Ordered;  
  
@Aspect  
public class OrderedAspect implements Ordered {  
  
    @Override  
    public int getOrder() {  
        // 返回的数值越小,优先级越高,即该切面会先执行  
        return 1;  
    }  
  
    @Before("execution(* com.example.service.*.*(..))")  
    public void beforeAdvice() {  
        System.out.println("Ordered aspect executed before method execution");  
    }  
}  
  
// 另一个切面,也实现了Ordered接口  
@Aspect  
public class AnotherOrderedAspect implements Ordered {  
  
    @Override  
    public int getOrder() {  
        // 返回的数值比OrderedAspect大,因此该切面会在OrderedAspect之后执行  
        return 2;  
    }  
  
    @Before("execution(* com.example.service.*.*(..))")  
    public void anotherBeforeAdvice() {  
        System.out.println("Another ordered aspect executed before method execution");  
    }  
}  
 

3. 动态代理的选择

  当目标对象没有实现接口时,Spring AOP默认使用CGLIB代理。但也可以通过配置强制使用CGLIB代理,即使目标对象实现了接口。

配置方式包括在XML配置文件中使用<aop:config proxy-target-class="true">或在<aop:aspectj-autoproxy>标签中设置proxy-target-class="true"。

4. 顾问(Advisor)

  顾问是切面的另一种实现方式,它将通知与切入点表达式封装在一起,提供了更灵活的切面配置方式。Spring提供了多种顾问实现,如NameMatchMethodPointcutAdvisor可以根据方法名匹配切入点。

代码示例

@Bean  
public Advisor nameMatchMethodPointcutAdvisor() {  
    NameMatchMethodPointcut pointcut = new NameMatchMethodPointcut();  
    pointcut.setMappedNames("mySpecialMethod");  
  
    MethodInterceptor interceptor = new MethodInterceptor() {  
        @Override  
        public Object invoke(MethodInvocation invocation) throws Throwable {  
            System.out.println("Before invoking " + invocation.getMethod().getName());  
            Object result = invocation.proceed();  
            System.out.println("After invoking " + invocation.getMethod().getName());  
            return result;  
        }  
    };  
  
    return new DefaultPointcutAdvisor(pointcut, interceptor);  
}

四、总结

  Spring AOP的高级用法涉及复杂的切入点表达式、环绕通知、动态代理的选择、顾问的使用以及声明式事务管理等方面。掌握这些高级用法可以帮助开发者更加灵活地使用Spring AOP,实现更加复杂和高效的切面编程。同时,也需要注意性能优化问题,以确保系统的稳定性和高效性。

标签:匹配,Spring,用法,切面,AOP,execution,public
From: https://blog.csdn.net/A79800/article/details/142594838

相关文章

  • SpringCloud入门
    SpringCloud原版笔记:狂神说笔记——SpringCloud快速入门23-subeiLY-博客园(cnblogs.com)一.前言 常见面试题什么是微服务?微服务之间是如何独立通讯的?SpringCloud和Dubbo有哪些区别?SpringBoot和SpringCloud,请你谈谈对他们的理解什么是服务熔断?什么是服......
  • token的用法(生成和验证)
    首先我们先来看一下图中显示的token,相信很多朋友都听说过token这种东西,但是没有深入了解过这些东西,下面让我浅显的介绍一下。首先,Token(令牌)是一个广泛使用的概念,尤其在计算机科学和网络安全领域。它的具体含义和用途可能会根据上下文有所不同。以下是一些常见的Token类型及其......
  • 基于springboot+vue的公文发文管理系统附带文章源码部署视频讲解等
    文章目录前言详细视频演示具体实现截图核心技术介绍前端框架Vue持久层框架MyBaits为什么选择我代码参考数据库参考测试用例参考源码获取前言......
  • 快速创建SpringBoot项目
     1.使用SpringInitializr创建项目1.1.在线生成项目         访问SpringInitializr网站            选择项目的基本配置:Project:MavenProject或GradleProject(通常使用Maven)Language:JavaSpringBootVersion:......
  • Springboot宠物乐园rp9dc(程序+源码+数据库+调试部署+开发环境)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表用户,商家,宠物分类,宠物信息,宠物商品,宠物疫苗,疫苗预约,疫苗提醒,萌宠托管,宠物寄养,资讯分类,宠物资讯,商品分类,到期提醒,个人宠物开题报告内容一、研究背......
  • Springboot宠物寄养酒店系统63ul4(程序+源码+数据库+调试部署+开发环境)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表用户,宠物寄养,商品分类,商品信息开题报告内容一、选题意义1.理论意义随着人们对宠物关注度的增加和养宠需求的增长,宠物寄养酒店成为了一个重要的服务行业。......
  • Springboot宠物户籍管理z7vi8(程序+源码+数据库+调试部署+开发环境)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表饲养人员,宠物信息,走失宠物,宠物资讯,通知公告开题报告内容一、研究背景随着人们生活水平的提高,宠物已成为现代家庭中不可或缺的一部分。然而,宠物管理尤其是宠......
  • Springboot宠物管理系统nt169(程序+源码+数据库+调试部署+开发环境)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表用户,寄养者,宠物分类,养宠经验,宠物寄养,宠物领养,走失宠物,网站公告开题报告内容一、引言随着现代生活节奏的加快和人们情感需求的日益增长,宠物已成为许多家......
  • 01.SpringBoot开发杂记-使用工具类,静态读取配置文件中的配置的写法
    使用工具类,静态读取配置文件中的配置的写法@ComponentpublicclassConfigUtils{privatestaticConfigUtilsinstance;//单例模式持有当前工具类的实例privateConfigUtils(){}@Value("${system.uploadPath}")privateStringuploadPath;//@Value注解......
  • Spring Boot 集成 RabbitMQ 发送延时消息
    1.SpringBoot集成RabbitMQ发送延时消息1.1.版本说明1.2.Spring配置1.3.定义常量1.4.配置交换机和队列1.5.测试1.SpringBoot集成RabbitMQ发送延时消息延时消息依赖于rabbitmq-delayed-message-exchangeRabbitMQ插件实现,Github地址,启用该插件后可......