Advice源码分析
parent
afb4410b1b
commit
7c7d37306e
|
@ -201,7 +201,7 @@
|
|||
- [ClassFilter](spring-aop/spring-aop-classFilter/README.md):确定类是否匹配拦截条件。<img src="https://img.shields.io/badge/Level-%E7%AE%80%E5%8D%95-0099ff"></img>
|
||||
- [MethodMatcher](spring-aop/spring-aop-methodMatcher/README.md):确定方法是否匹配拦截条件。<img src="https://img.shields.io/badge/Level-%E7%AE%80%E5%8D%95-0099ff"></img>
|
||||
- [Pointcut](spring-aop/spring-aop-pointcut/README.md):定义切入点,匹配被拦截的方法。<img src="https://img.shields.io/badge/Level-%E7%AE%80%E5%8D%95-0099ff"></img>
|
||||
- [Advice]():AOP中定义各种通知类型行为的核心接口。<img src="https://img.shields.io/badge/Level-%E4%B8%80%E8%88%AC-%23FF6347"></img>
|
||||
- [Advice](spring-aop/spring-aop-advice/README.md):AOP中定义各种通知类型行为的核心接口。<img src="https://img.shields.io/badge/Level-%E4%B8%80%E8%88%AC-%23FF6347"></img>
|
||||
- [MethodInterceptor](spring-aop/spring-aop-advice-methodInterceptor/README.md):拦截方法执行,允许在前后添加额外逻辑。<img src="https://img.shields.io/badge/Level-%E4%B8%80%E8%88%AC-%23FF6347"></img>
|
||||
- [MethodBeforeAdvice](spring-aop/spring-aop-advice-methodBeforeAdvice/README.md):允许在方法调用之前插入自定义逻辑。<img src="https://img.shields.io/badge/Level-%E4%B8%80%E8%88%AC-%23FF6347"></img>
|
||||
- [AfterReturningAdvice](spring-aop/spring-aop-advice-afterReturningAdvice/README.md):允许在方法调用之后插入自定义逻辑。<img src="https://img.shields.io/badge/Level-%E4%B8%80%E8%88%AC-%23FF6347"></img>
|
||||
|
|
|
@ -39,6 +39,7 @@
|
|||
<module>spring-aop-aopContext</module>
|
||||
<module>spring-aop-targetSourceCreator</module>
|
||||
<module>spring-aop-exposeInvocationInterceptor</module>
|
||||
<module>spring-aop-advice</module>
|
||||
</modules>
|
||||
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
|
|
@ -0,0 +1,144 @@
|
|||
## Advice
|
||||
|
||||
- [Advice](#advice)
|
||||
- [一、基本信息](#一基本信息)
|
||||
- [二、基本描述](#二基本描述)
|
||||
- [三、主要功能](#三主要功能)
|
||||
- [四、接口源码](#四接口源码)
|
||||
- [五、子接口](#五子接口)
|
||||
- [六、类关系图](#六类关系图)
|
||||
|
||||
### 一、基本信息
|
||||
|
||||
✒️ **作者** - Lex 📝 **博客** - [掘金](https://juejin.cn/user/4251135018533068/posts) 📚 **源码地址** - [github](https://github.com/xuchengsheng/spring-reading)
|
||||
|
||||
### 二、基本描述
|
||||
|
||||
`Advice`接口是Spring AOP中的核心接口之一,用于定义在切面逻辑中要执行的操作。它允许我们在目标方法执行前、执行后、抛出异常时等不同的连接点上添加自定义的行为。`Advice`接口的实现类可以通过方法拦截器(MethodInterceptor)、前置通知(BeforeAdvice)、后置通知(AfterReturningAdvice)、异常通知(ThrowsAdvice)等方式来实现不同类型的通知逻辑。
|
||||
|
||||
### 三、主要功能
|
||||
|
||||
1. **定义通知逻辑**
|
||||
+ 允许我们定义在目标方法执行前、执行后、抛出异常时等不同连接点上执行的操作。
|
||||
2. **支持不同类型的通知**
|
||||
+ `Advice`接口的实现类可以实现不同类型的通知逻辑,如前置通知、后置通知、环绕通知、异常通知等。
|
||||
3. **与切点结合**
|
||||
+ `Advice`通常与切点(Pointcut)结合使用,以确定通知应该在哪些连接点上执行。
|
||||
4. **应用于Advisor**
|
||||
+ `Advice`通常作为`Advisor`的一部分,与切点结合,以实现切面的逻辑。
|
||||
|
||||
### 四、接口源码
|
||||
|
||||
`Advice`接口是Spring AOP中的一个标签接口,用于定义各种类型的通知,例如拦截器。通过实现该接口,我们可以定义在方法执行前、执行后、抛出异常时等不同连接点上执行的操作,从而实现对应用程序行为的干预和控制。
|
||||
|
||||
```java
|
||||
/**
|
||||
* Advice的标签接口。实现可以是任何类型的通知,例如拦截器。
|
||||
*
|
||||
* 该接口用于定义通知。通知可以是在方法执行前、执行后、抛出异常时等不同连接点上执行的操作。
|
||||
* 实现该接口的类可以是拦截器(Interceptors)等任何类型的通知。
|
||||
*
|
||||
* @author Rod Johnson
|
||||
* @version $Id: Advice.java,v 1.1 2004/03/19 17:02:16 johnsonr Exp $
|
||||
*/
|
||||
public interface Advice {
|
||||
|
||||
}
|
||||
```
|
||||
|
||||
### 五、子接口
|
||||
|
||||
1. **AfterAdvice(后置通知)**
|
||||
|
||||
+ 是一个标记接口,用于表示后置通知的类型。
|
||||
|
||||
2. **AfterReturningAdvice(返回后通知)**
|
||||
|
||||
+ 用于在目标方法成功执行并返回结果后执行自定义逻辑。
|
||||
|
||||
3. **BeforeAdvice(前置通知)**
|
||||
|
||||
+ 用于在目标方法执行前执行自定义逻辑。
|
||||
|
||||
4. **ConstructorInterceptor(构造器拦截器)**
|
||||
|
||||
+ 实现该接口的类可以在目标对象的构造器被调用时执行自定义逻辑。
|
||||
|
||||
5. **Interceptor(拦截器)**
|
||||
|
||||
+ 是一个标记接口,表示通用的拦截器类型,通常用于包装方法调用。
|
||||
|
||||
6. **IntroductionInterceptor(引介拦截器)**
|
||||
|
||||
+ 实现该接口的类可以在目标对象上添加新的方法和属性,用于实现AOP引介功能。
|
||||
|
||||
7. **MethodBeforeAdvice(方法前置通知)**
|
||||
|
||||
+ 用于在目标方法执行前执行自定义逻辑。
|
||||
|
||||
8. **MethodInterceptor(方法拦截器)**
|
||||
|
||||
+ 实现该接口的类可以在目标方法执行前、执行后以及抛出异常时进行拦截,并执行自定义的逻辑。
|
||||
|
||||
9. **ThrowsAdvice(异常通知)**
|
||||
|
||||
+ 用于在目标方法抛出异常时执行自定义逻辑。
|
||||
|
||||
### 六、类关系图
|
||||
|
||||
~~~mermaid
|
||||
classDiagram
|
||||
direction BT
|
||||
class Advice {
|
||||
<<Interface>>
|
||||
|
||||
}
|
||||
class AfterAdvice {
|
||||
<<Interface>>
|
||||
|
||||
}
|
||||
class AfterReturningAdvice {
|
||||
<<Interface>>
|
||||
|
||||
}
|
||||
class BeforeAdvice {
|
||||
<<Interface>>
|
||||
|
||||
}
|
||||
class ConstructorInterceptor {
|
||||
<<Interface>>
|
||||
|
||||
}
|
||||
class Interceptor {
|
||||
<<Interface>>
|
||||
|
||||
}
|
||||
class IntroductionInterceptor {
|
||||
<<Interface>>
|
||||
|
||||
}
|
||||
class MethodBeforeAdvice {
|
||||
<<Interface>>
|
||||
|
||||
}
|
||||
class MethodInterceptor {
|
||||
<<Interface>>
|
||||
|
||||
}
|
||||
class ThrowsAdvice {
|
||||
<<Interface>>
|
||||
|
||||
}
|
||||
|
||||
AfterAdvice --> Advice
|
||||
AfterReturningAdvice --> AfterAdvice
|
||||
BeforeAdvice --> Advice
|
||||
ConstructorInterceptor --> Interceptor
|
||||
Interceptor --> Advice
|
||||
IntroductionInterceptor --> Advice
|
||||
IntroductionInterceptor --> MethodInterceptor
|
||||
MethodBeforeAdvice --> BeforeAdvice
|
||||
MethodInterceptor --> Interceptor
|
||||
ThrowsAdvice --> AfterAdvice
|
||||
|
||||
~~~
|
|
@ -0,0 +1,14 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<parent>
|
||||
<groupId>com.xcs.spring</groupId>
|
||||
<artifactId>spring-aop</artifactId>
|
||||
<version>0.0.1-SNAPSHOT</version>
|
||||
</parent>
|
||||
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<artifactId>spring-aop-advice</artifactId>
|
||||
|
||||
</project>
|
Loading…
Reference in New Issue