JointPoint用法及与ProceedingJoinPoint 的关系

2020-07-21 10:02:03 浏览数 (1)

在使用SpringAop时,大家会经常用到 JoinPoint 这个对象,归纳一下它的各种用法,还有它和ProcessdingJoinpoint 的关系。

JointPoint 意为加入的点 术语为 连接点 (连接切点与所要切入的方法),放到SpringAop中为所加入具体“切点”的点。

当我们使用 环绕通知 @Around 作为通知类型时,会使用ProceedingJoinPoint 这个连接点 ,ProceedingJoinPoint为 JoinPoint的子接口

代码语言:javascript复制
public interface ProceedingJoinPoint extends JoinPoint {
代码语言:javascript复制
void set$AroundClosure(AroundClosure var1);
// 执行方法 ,返回执行的结果 因为 环绕通知 不像 @Before @After 能够区分出,切点方法执行的前后要执行的前后顺序,
//因此使用 proceed()来 区分 方法执行的前后
代码语言:javascript复制
Object proceed() throws Throwable;
//使用自己定义的 参数去Object[] var1 去执行方法
代码语言:javascript复制
Object proceed(Object[] var1) throws Throwable;

}

ProceedingJoinPoint 作为JoinPoint的子接口 同样可使用 JoinPoint的接口方法。接下来看JoinPoint的方法 :

代码语言:javascript复制
public interface JoinPoint {
代码语言:javascript复制
String toString();
代码语言:javascript复制
String toShortString();
代码语言:javascript复制
String toLongString();
//获得当前的代理类对象 
Object getThis();
//获取被代理的目标对象 常用
Object getTarget();
//获取被代理的方法参数 常用
Object[] getArgs();
//获取连接点的方法签名 展开具体的连接点的签名 常用
Signature getSignature(); 
//获取 资源的位置
SourceLocation getSourceLocation();
//获得连接点的通知类型
代码语言:javascript复制
String getKind();
代码语言:javascript复制
public interface EnclosingStaticPart extends JoinPoint.StaticPart {
}
//是一个 内部接口 接口的静态部分
public interface StaticPart {
  Signature getSignature();

 SourceLocation getSourceLocation();

 String getKind();

 int getId();

 String toString();

 String toShortString();

 String toLongString();
}

}

使用内部接口的意义益处

作用上讲:

类的内部接口和外部接口,都是启到接口的作用,接口就是来定义规范。 具体可以理解成一个类中进一步的逻辑细分

好处:

  • 一种对那些在同一个地方使用的接口进行逻辑上分组;  
  • 封装思想的体现;
  • 嵌套接口可以增强代码的易读性和可维护性;
  • 内部接口不管有没有声明static,都是静态的.可以访问外部类的私有内容。

使用:当你定义了内部接口,实现的时候可以选择去实现这个内部接口 StacticPart,也可以选择实现内部接口的外部接口 JoinPoint,因此当你只想实现JoinPoint 中的个别方法,且内部类中的StacticPiont都用的话,只用实现 StacticPoint 就好,实现了逻辑上的细分。

在Map 中同样用到了内部类,定义Entry。

多次用到的 Signature接口 

代码语言:javascript复制
public interface Signature {
  String toString();
 //获得连接点较短的信息
 String toShortString();
 //获得连接点较长的信息
 String toLongString();
 //得到连接方法名 常用
 String getName();
 //得到方法的声明类型 Modifier.toString(jp.getSignature().getModifiers())
 int getModifiers(); 
 //得到连接点的类型 
 Class getDeclaringType();
 //得到连接点方法的类名 常用
 String getDeclaringTypeName();
}

参考网站

https://www.cnblogs.com/chenpi/p/5518400.html

0 人点赞