Pointcut优化

ProxyFactory优化
master
linlei 2024-05-07 11:37:54 +08:00
parent 0ada3c6eb5
commit 2413795b78
2 changed files with 7 additions and 15 deletions

View File

@ -8,12 +8,6 @@
- [五、主要实现](#五主要实现)
- [六、类关系图](#六类关系图)
- [七、最佳实践](#七最佳实践)
- [MyCustomPointcut](#mycustompointcut)
- [AspectJExpressionPointcut](#aspectjexpressionpointcut)
- [AnnotationMatchingPointcut](#annotationmatchingpointcut)
- [NameMatchMethodPointcut](#namematchmethodpointcut)
- [JdkRegexpMethodPointcut](#jdkregexpmethodpointcut)
### 一、基本信息
@ -149,7 +143,7 @@ TruePointcut ..> Pointcut
### 七、最佳实践
#### MyCustomPointcut
**MyCustomPointcut**
使用自定义的 `Pointcut` 对象 `MyCustomPointcut`。在 `customPointcut` 方法中,我们创建了 `MyCustomPointcut` 的实例,并通过 `showMatchesLog` 方法展示了其对类和方法的匹配情况。最后,我们通过调用 `showMatchesLog` 方法来检查 `MyCustomPointcut` 对象对目标类 `MyService` 中的方法的匹配情况,并输出匹配结果。
@ -254,7 +248,7 @@ MethodMatcher MyService getAge = true
MethodMatcher MyService setName = false
```
#### AspectJExpressionPointcut
**AspectJExpressionPointcut**
使用 `AspectJExpressionPointcut` 创建一个基于 AspectJ 表达式的切入点。在 `aspectJExpressionPointcut` 方法中,我们创建了 `AspectJExpressionPointcut` 的实例,并设置了 AspectJ 表达式 `"execution(* com.xcs.spring.MyService.get*())"`,该表达式匹配了 `com.xcs.spring.MyService` 类中以 `get` 开头的所有方法。最后,我们通过调用 `showMatchesLog` 方法来检查 `AspectJExpressionPointcut` 对象对指定类中的方法的匹配情况,并输出匹配结果。
@ -285,7 +279,7 @@ MethodMatcher MyService getAge = true
MethodMatcher MyService setName = false
```
#### AnnotationMatchingPointcut
**AnnotationMatchingPointcut**
使用 `AnnotationMatchingPointcut` 创建一个基于注解匹配的切入点。在 `annotationMatchingPointcut` 方法中,我们创建了 `AnnotationMatchingPointcut` 的实例,并指定了类级别注解 `MyClassAnnotation` 和方法级别注解 `MyMethodAnnotation`,同时设置了不检查继承的方法。最后,我们通过调用 `showMatchesLog` 方法来检查 `AnnotationMatchingPointcut` 对象对指定类中的方法的匹配情况,并输出匹配结果。
@ -315,7 +309,7 @@ MethodMatcher MyService getAge = false
MethodMatcher MyService setName = true
```
#### NameMatchMethodPointcut
**NameMatchMethodPointcut**
使用 `NameMatchMethodPointcut` 创建一个基于方法名匹配的切入点。在 `nameMatchMethodPointcut` 方法中,我们创建了 `NameMatchMethodPointcut` 的实例,并添加了要匹配的方法名 `getAge`。然后,我们通过调用 `showMatchesLog` 方法来检查 `NameMatchMethodPointcut` 对象对指定类中的方法的匹配情况,并输出匹配结果。
@ -346,7 +340,7 @@ MethodMatcher MyService getAge = true
MethodMatcher MyService setName = false
```
#### JdkRegexpMethodPointcut
**JdkRegexpMethodPointcut**
使用 `JdkRegexpMethodPointcut` 创建一个基于 JDK 正则表达式匹配的切入点。在 `jdkRegexpMethodPointcut` 方法中,我们创建了 `JdkRegexpMethodPointcut` 的实例,并设置了正则表达式模式 `".*set.*"`,该模式匹配了所有包含 "set" 字符串的方法名。然后,我们通过调用 `showMatchesLog` 方法来检查 `JdkRegexpMethodPointcut` 对象对指定类中的方法的匹配情况,并输出匹配结果。

View File

@ -7,8 +7,6 @@
- [四、类关系图](#四类关系图)
- [五、最佳实践](#五最佳实践)
- [六、源码分析](#六源码分析)
- [初始化阶段](#初始化阶段)
- [创建代理阶段](#创建代理阶段)
### 一、基本信息
@ -103,7 +101,7 @@ proxy = class com.xcs.spring.MyService$$EnhancerBySpringCGLIB$$d9bdf44b
### 六、源码分析
#### 初始化阶段
**初始化阶段**
在`org.springframework.aop.framework.ProxyCreatorSupport#ProxyCreatorSupport()`方法中,`ProxyCreatorSupport`类是`ProxyFactory`类的父类,因此当初始化`ProxyFactory`时,`ProxyCreatorSupport`也会跟着初始化,确保在创建代理对象时能够利用`ProxyCreatorSupport`的功能。在构造函数中,它初始化了`aopProxyFactory`成员变量,将其设置为一个`DefaultAopProxyFactory`对象用于后续创建AOP代理对象。
@ -160,7 +158,7 @@ public void setInterfaces(Class<?>... interfaces) {
}
```
#### 创建代理阶段
**创建代理阶段**
在`org.springframework.aop.framework.ProxyFactory#getProxy()`方法中,根据工厂中的配置创建一个新的代理对象。可以重复调用此方法,根据已添加或删除的接口以及添加或移除的拦截器的不同,其效果会有所变化。该方法会使用默认的类加载器,通常是线程上下文类加载器(如果需要代理创建时)。最终返回创建的代理对象。