Spring学习笔记

本文详细介绍了Spring中的AOP概念,包括连接点、切点、切面、织入等核心概念,并重点讲解了AspectJ的切点表达式用法,如通配符、方法匹配等。此外,还探讨了JoinPoint和ProceedingJoinPoint接口以及Signature对象的用途。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Spring学习笔记

AOP详解与实战

https://www.cnblogs.com/itlihao/p/14298681.html

aop相关概念:

  • 连接点(Join point)
    连接点是在应用执行过程中能够插入切面的一个点。
  • 切点(Pointcut)
    一个切面并不需要通知应用的所有连接点,切点有助于缩小切面所通知的连接点范围。如果说通知定义了切面的“什么”和“何时”的话,那么切点就定义了“何处”。因此,切点其实就是定义了需要执行在哪些连接点上执行通知。
  • 切面(Aspect)
    切面是通知和切点的结合。通知和切点共同定义了切面的全部内容——它是什么,在何时和在何处完成其功能。
  • 织入(Weaving)
    织入是把切面应用到目标对象并创建新的代理对象的过程。切面在指定的连接点被织入到目标对象中。

AspectJ的aop写法

通配符的使用:

  • *:匹配所有字符
  • …:一般用于匹配多个包,多个参数
  • +:表示类及其子类
  • 运算符有:&&,||,! AspectJ使用 且(&&)、或(||)、非(!)来组合切入点表达式。
  1. execution( * com.example.aop..(…))

    execution:就是表达式的主体。
    第一个*:返回类型,可以用代表所有类型
    com.example.aop:表示需要拦截的路径包名
    第二个*:类名,可以用代表所有类
    第三个*:方法名,可以用*表示所有方法
    (..):..表示任意参数
    
  2. @Around(“within(类型表达式)”)

    within(cn.javass..*)                        cn.javass包及子包下的任何方法执行
    within(cn.javass..IPointcutService+)        cn.javass包或所有子包下IPointcutService类型及子类型的任何方法
    within(@cn.javass..Secure *)                持有cn.javass..Secure注解的任何类型的任何方法,必须是在目标对象上声明这个注解,在接口上声明的对它不起作用
    
  3. @Around("@within(注解类型))

    @within cn.javass.spring.chapter6.Secure)   任何目标对象对应的类型持有Secure注解的类方法;必须是在目标对象上声明这个注解,在接口上声明的对它不起作用
    
  4. @Around(“target(类型全限定名)”)

    target(cn.javass.spring.chapter6.service.IPointcutService)      当前目标对象(非AOP对象)实现了 IPointcutService接口的任何方法
    target(cn.javass.spring.chapter6.service.IIntroductionService)  当前目标对象(非AOP对象) 实现了IIntroductionService 接口的任何方法不能是引入接口
    
  5. @Around(“@target(注解类型)”)

    @target (cn.javass.spring.chapter6.Secure)    任何目标对象持有Secure注解的类方法;必须是在目标对象上声明这个注解,在接口上声明的对它不起作用
    
  6. @Around(“args(参数类型列表)”)

    args (java.io.Serializable,..)         任何一个以接受“传入参数类型为 java.io.Serializable” 开头,且其后可跟任意个任意类型的参数的方法执行,args指定的参数类型是在运行时动态匹配的
    
  7. @Around(“@args(注解列表)”)

    @args (cn.javass.spring.chapter6.Secure)   任何一个只接受一个参数的方法,且方法运行时传入的参数持有注解 cn.javass.spring.chapter6.Secure;动态切入点,类似于arg指示符;
    
  8. @Around(“@annotation(注解类型)”)

    @annotation(cn.javass.spring.chapter6.Secure )    当前执行方法上持有注解 cn.javass.spring.chapter6.Secure将被匹配
    
  9. @Around(“this(类型全限定名)”)

    this(cn.javass.spring.chapter6.service.IPointcutService)         当前AOP对象实现了 IPointcutService接口的任何方法
    this(cn.javass.spring.chapter6.service.IIntroductionService)     当前AOP对象实现了 IIntroductionService接口的任何方法也可能是引入接口
    

JoinPoint对象

public interface JoinPoint {  
    String toString();          //连接点所在位置的相关信息  
    String toShortString();     //连接点所在位置的简短相关信息  
    String toLongString();      //连接点所在位置的全部相关信息  
    Object getThis();           //返回AOP代理对象  
    Object getTarget();         //返回目标对象  
    Object[] getArgs();         //返回被通知方法参数列表  
    Signature getSignature();   //返回当前连接点签名  
    SourceLocation getSourceLocation();//返回连接点方法所在类文件中的位置  
    String getKind();           //连接点类型  
    StaticPart getStaticPart(); //返回连接点静态部分  
}  

ProceedingJoinPoint对象介绍:

ProceedingJoinPoint对象是JoinPoint的子接口。

主要多了如下两个方法:
Object proceed() throws Throwable              //执行目标方法 
Object proceed(Object[] var1) throws Throwable //传入的新的参数去执行目标方法 

关于Signature对象介绍:

Signature对象:是一个接口。用于获取或记录有关连接点的反射信息。他的子接口还提供了很多额外的实用方法。

常用子接口如下:

UnlockSignature       实现类     UnlockSignatureImpl
LockSignature         实现类     LockSignatureImpl
CatchClauseSignature  实现类     CatchClauseSignatureImpl
MemberSignature       
      子接口     FieldSignature                     实现类   FieldSignatureImpl
      子接口     CodeSignature[它还有很多子接口]      实现类   CodeSignatureImpl

常用方法如下:

String toString();         
String toShortString();        //返回此签名的字符串缩写形式
String toLongString();         //返回此签名的字符串扩展形式
String getName();              //返回此签名的方法【即返回方法名】
int    getModifiers();         //以整数形式返回此签名方法的修饰符。 
Class  getDeclaringType();     //返回一个java.lang.Class对象,该对象表示声明此成员的类或接口。
String getDeclaringTypeName(); //返回声明类型的全限定名称
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值