From 7c7d37306e3eed8ba4861cb3f4b8118f6abe9b80 Mon Sep 17 00:00:00 2001 From: linlei Date: Fri, 26 Apr 2024 17:54:45 +0800 Subject: [PATCH] =?UTF-8?q?Advice=E6=BA=90=E7=A0=81=E5=88=86=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- spring-aop/pom.xml | 1 + spring-aop/spring-aop-advice/README.md | 144 +++++++++++++++++++++++++ spring-aop/spring-aop-advice/pom.xml | 14 +++ 4 files changed, 160 insertions(+), 1 deletion(-) create mode 100644 spring-aop/spring-aop-advice/README.md create mode 100644 spring-aop/spring-aop-advice/pom.xml diff --git a/README.md b/README.md index 325900c..b7b47f7 100644 --- a/README.md +++ b/README.md @@ -201,7 +201,7 @@ - [ClassFilter](spring-aop/spring-aop-classFilter/README.md):确定类是否匹配拦截条件。 - [MethodMatcher](spring-aop/spring-aop-methodMatcher/README.md):确定方法是否匹配拦截条件。 - [Pointcut](spring-aop/spring-aop-pointcut/README.md):定义切入点,匹配被拦截的方法。 - - [Advice]():AOP中定义各种通知类型行为的核心接口。 + - [Advice](spring-aop/spring-aop-advice/README.md):AOP中定义各种通知类型行为的核心接口。 - [MethodInterceptor](spring-aop/spring-aop-advice-methodInterceptor/README.md):拦截方法执行,允许在前后添加额外逻辑。 - [MethodBeforeAdvice](spring-aop/spring-aop-advice-methodBeforeAdvice/README.md):允许在方法调用之前插入自定义逻辑。 - [AfterReturningAdvice](spring-aop/spring-aop-advice-afterReturningAdvice/README.md):允许在方法调用之后插入自定义逻辑。 diff --git a/spring-aop/pom.xml b/spring-aop/pom.xml index 25433d8..537da1b 100644 --- a/spring-aop/pom.xml +++ b/spring-aop/pom.xml @@ -39,6 +39,7 @@ spring-aop-aopContext spring-aop-targetSourceCreator spring-aop-exposeInvocationInterceptor + spring-aop-advice 4.0.0 diff --git a/spring-aop/spring-aop-advice/README.md b/spring-aop/spring-aop-advice/README.md new file mode 100644 index 0000000..ccf44a2 --- /dev/null +++ b/spring-aop/spring-aop-advice/README.md @@ -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 { +<> + +} +class AfterAdvice { +<> + +} +class AfterReturningAdvice { +<> + +} +class BeforeAdvice { +<> + +} +class ConstructorInterceptor { +<> + +} +class Interceptor { +<> + +} +class IntroductionInterceptor { +<> + +} +class MethodBeforeAdvice { +<> + +} +class MethodInterceptor { +<> + +} +class ThrowsAdvice { +<> + +} + +AfterAdvice --> Advice +AfterReturningAdvice --> AfterAdvice +BeforeAdvice --> Advice +ConstructorInterceptor --> Interceptor +Interceptor --> Advice +IntroductionInterceptor --> Advice +IntroductionInterceptor --> MethodInterceptor +MethodBeforeAdvice --> BeforeAdvice +MethodInterceptor --> Interceptor +ThrowsAdvice --> AfterAdvice + +~~~ \ No newline at end of file diff --git a/spring-aop/spring-aop-advice/pom.xml b/spring-aop/spring-aop-advice/pom.xml new file mode 100644 index 0000000..1b57f0f --- /dev/null +++ b/spring-aop/spring-aop-advice/pom.xml @@ -0,0 +1,14 @@ + + + + com.xcs.spring + spring-aop + 0.0.1-SNAPSHOT + + + 4.0.0 + spring-aop-advice + + \ No newline at end of file