SpringAOP中@Pointcut的用法详解

 更新时间:2023年08月02日 09:49:55   作者:未来灬可期  
这篇文章主要介绍了SpringAOP中@Pointcut的用法详解,Pointcut(切点)是面向切面编程中的一个非常重要的概念,此概念由spring框架定义,Pointcut只是一种筛选规则,需要的朋友可以参考下

SpringAOP的@Pointcut

格式:

execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern)throws-pattern?) 

括号中各个pattern分别表示:

  • 修饰符匹配(modifier-pattern?)
  • 返回值匹配(ret-type-pattern)可以为*表示任何返回值,全路径的类名等
  • 类路径匹配(declaring-type-pattern?)
  • 方法名匹配(name-pattern)可以指定方法名 或者 代表所有, set 代表以set开头的所有方法
  • 参数匹配((param-pattern))可以指定具体的参数类型,多个参数间用“,”隔开,各个参数也可以用“”来表示匹配任意类型的参数,如(String)表示匹配一个String参数的方法;(,String) 表示匹配有两个参数的方法,第一个参数可以是任意类型,而第二个参数是String类型;可以用(…)表示零个或多个任意参数
  • 异常类型匹配(throws-pattern?)

其中后面跟着“?”的是可选项

现在来看看几个例子:

1)execution(* *(..))  
//表示匹配所有方法  
2)execution(public * com. savage.service.UserService.*(..))  
//表示匹配com.savage.server.UserService中所有的公有方法  
3)execution(* com.savage.server..*.*(..))  
//表示匹配com.savage.server包及其子包下的所有方法

在Spring 2.0中,Pointcut的定义包括两个部分:Pointcut表示式(expression)和Pointcut签名(signature)

//Pointcut表示式
@Pointcut("execution(* com.savage.aop.MessageSender.*(..))")
//Point签名
private void log(){} 

然后要使用所定义的Pointcut时,可以指定Pointcut签名 如下:

@Before("og()")

这种使用方式等同于以下方式,直接定义execution表达式使用

@Before("execution(* com.savage.aop.MessageSender.*(..))")

Pointcut定义时,还可以使用&&、||、! 这三个运算

@Pointcut("execution(* com.savage.aop.MessageSender.*(..))")
private void logSender(){}
@Pointcut("execution(* com.savage.aop.MessageReceiver.*(..))")
private void logReceiver(){}
@Pointcut("logSender() || logReceiver()")
private void logMessage(){}

这个例子中,logMessage()将匹配任何MessageSender和MessageReceiver中的任何方法。

还可以将一些公用的Pointcut放到一个类中,以供整个应用程序使用,如下:

package com.savage.aop;
import org.aspectj.lang.annotation.*;
public class Pointcuts {
@Pointcut("execution(* *Message(..))")
public void logMessage(){}
@Pointcut("execution(* *Attachment(..))")
public void logAttachment(){}
@Pointcut("execution(* *Service.*(..))")
public void auth(){}
}

在使用上面定义Pointcut时,指定完整的类名加上Pointcut签名就可以了,如:

package com.savage.aop;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;
@Aspect
public class LogBeforeAdvice {
@Before("com.sagage.aop.Pointcuts.logMessage()")
public void before(JoinPoint joinPoint) {
System.out.println("Logging before " + joinPoint.getSignature().getName());
}
}

当基于XML Sechma实现Advice时,如果Pointcut需要被重用,可以使用aop:pointcut</aop:pointcut>来声明Pointcut,然后在需要使用这个Pointcut的地方,用pointcut-ref引用就行了,如:

<aop:config>
  <aop:pointcut id="log" expression="execution(* com.savage.simplespring.bean.MessageSender.*(..))"/>
  <aop:aspect id="logging" ref="logBeforeAdvice">
    <aop:before pointcut-ref="log" method="before"/>
    <aop:after-returning pointcut-ref="log" method="afterReturning"/>
  </aop:aspect>
</aop:config>

到此这篇关于SpringAOP中@Pointcut的用法详解的文章就介绍到这了,更多相关SpringAOP的@Pointcut内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java中Exception和Error的区别详解

    Java中Exception和Error的区别详解

    在 Java 开发面试中,Exception 和 Error 的区别是一个经典问题,这个问题不仅考察我们对 Java 异常处理机制的理解,还考察我们在实际开发中如何处理异常的能力,所以本文主要给大家介绍一下Java中Exception和Error的区别,需要的朋友可以参考下
    2025-04-04
  • springBoot2.6.2自动装配之注解源码解析

    springBoot2.6.2自动装配之注解源码解析

    对于springboot个人认为它就是整合了各种组件,然后提供对应的自动装配和启动器(starter),基于这个流程去实现一个定义的装配组件,下面这篇文章主要给大家介绍了关于springBoot2.6.2自动装配之注解源码解析的相关资料,需要的朋友可以参考下
    2022-01-01
  • 五分钟带你快速学习Spring IOC

    五分钟带你快速学习Spring IOC

    这篇文章主要给大家介绍了关于如何通过五分钟快速学习Spring IOC的相关资料,文中通过实例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2022-03-03
  • Java 排序算法整合(冒泡,快速,希尔,拓扑,归并)

    Java 排序算法整合(冒泡,快速,希尔,拓扑,归并)

    这篇文章主要介绍了Java 排序算法整合(冒泡,快速,希尔,拓扑,归并),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09
  • springboot从application.properties中注入list, map方式

    springboot从application.properties中注入list, map方式

    这篇文章主要介绍了springboot从application.properties中注入list,map方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • Java位掩码控制权限与(&)或(|)非(~)、>的介绍

    Java位掩码控制权限与(&)或(|)非(~)、>的介绍

    今天小编就为大家分享一篇关于Java位掩码控制权限与(&)或(|)非(~)、>的介绍,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03
  • java this 用法详解及简单实例

    java this 用法详解及简单实例

    这篇文章主要介绍了java this 用法详解及简单实例的相关资料,需要的朋友可以参考下
    2017-03-03
  • Spring Boot JWT登录授权使用(无感刷新)

    Spring Boot JWT登录授权使用(无感刷新)

    JWT作为一种轻量级的身份认证与授权方案,凭借其无状态、可跨域、易于扩展的特性,成为 Spring Boot 项目中实现认证授权的主流选择,本文详解Spring Boot整合 JWT 实现登录认证与授权的全流程,助力开发者快速搭建安全可靠的认证授权体系,感兴趣的可以了解一下
    2026-04-04
  • 整理Java编程中常用的基本描述符与运算符

    整理Java编程中常用的基本描述符与运算符

    这篇文章主要介绍了Java编程中常用的基本描述符与运算符整理,包括运算符优先级等平时经常查看反复记忆的知识点,需要的朋友可以参考下
    2016-02-02
  • Java正则表达式匹配电话格式

    Java正则表达式匹配电话格式

    正则表达式是由普通的字符以及特殊字符组成的文字模式,用来在查找文字主体时待匹配的一个或多个字符串。本文给大家介绍java正则表达式匹配电话格式,对java正则表达式匹配相关知识感兴趣的朋友一起学习吧
    2015-11-11

最新评论