这是indexloc提供的服务,不要输入任何密码
Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
138 commits
Select commit Hold shift + click to select a range
11db48f
Advice源码分析
Apr 7, 2024
2a141eb
Advice源码分析
Apr 7, 2024
9ac46e3
Advisor源码分析
Apr 7, 2024
63ffb8b
Advisor源码分析
Apr 7, 2024
33e976a
优化Pointcut
Apr 7, 2024
b6b87f6
AdvisorAdapter源码分析
Apr 8, 2024
ed84b4e
AdvisorAdapter源码分析
Apr 8, 2024
10a8f32
TargetSource源码分析
Apr 9, 2024
c638856
TargetSource源码分析
Apr 9, 2024
fec3023
AopProxy源码分析
Apr 9, 2024
f3801c4
AopProxy源码分析
Apr 9, 2024
05d31a0
AopProxy源码分析
Apr 9, 2024
fcb71f1
ClassFilter源码分析
Apr 10, 2024
1efafee
MethodMatcher源码分析
Apr 10, 2024
0b1e9f6
JDK动态代理源码分析
Apr 10, 2024
7a5b7f7
Cglib动态代理源码分析
Apr 10, 2024
d2c74ec
JDK动态代理优化
Apr 10, 2024
1bc64a0
MethodInterceptor接口源码分析
Apr 11, 2024
9f6a76f
MethodBeforeAdvice接口源码分析
Apr 11, 2024
06d448f
MethodBeforeAdvice接口源码分析
Apr 11, 2024
ded8cd6
MethodBeforeAdvice接口源码分析
Apr 11, 2024
47b5836
删除advice接口源码
Apr 11, 2024
a97d034
优化JDK动态代理
Apr 11, 2024
da58336
优化Cglib动态代理
Apr 11, 2024
1140258
优化AopProxy
Apr 11, 2024
2ce5a52
优化ClassFilter
Apr 11, 2024
2645dc4
优化MethodMatcher
Apr 11, 2024
404bbea
优化Pointcut
Apr 11, 2024
9a393aa
优化Advisor
Apr 11, 2024
7c79786
优化AdvisorAdapter
Apr 11, 2024
34ad90f
优化TargetSource
Apr 11, 2024
7c8a58f
@EnableLoadTimeWeaving源码分析
Apr 13, 2024
2d0077e
@EnableLoadTimeWeaving源码分析
Apr 13, 2024
e97b11d
@EnableLoadTimeWeaving源码分析
Apr 13, 2024
a65d87a
@EnableLoadTimeWeaving优化
Apr 13, 2024
d642297
AopProxyFactory源码分析
Apr 13, 2024
7c297bf
AopProxyFactory源码分析
Apr 13, 2024
931ce1f
AspectInstanceFactory源码分析
Apr 15, 2024
e668f62
AspectInstanceFactory源码分析
Apr 15, 2024
b131859
AspectJAdvisorFactory源码分析
Apr 15, 2024
c410232
AspectJAdvisorFactory优化
Apr 16, 2024
fe39199
MetadataAwareAspectInstanceFactory优化
Apr 16, 2024
f0e5b15
BeanFactoryAspectJAdvisorsBuilder源码分析
Apr 16, 2024
fd385e8
BeanFactoryAspectJAdvisorsBuilder源码分析
Apr 16, 2024
963435d
BeanFactoryAdvisorRetrievalHelper源码分析
Apr 16, 2024
3b608bc
BeanFactoryAdvisorRetrievalHelper源码分析
Apr 16, 2024
9102e99
AnnotationAwareAspectJAutoProxyCreator源码分析
Apr 17, 2024
b073223
AnnotationAwareAspectJAutoProxyCreator源码分析
Apr 17, 2024
2752305
AnnotationAwareAspectJAutoProxyCreator源码分析
Apr 17, 2024
2850436
ProxyFactory源码分析
Apr 17, 2024
e9a2f29
ProxyFactory源码分析
Apr 17, 2024
62cb674
AnnotationAwareAspectJAutoProxyCreator优化
Apr 17, 2024
0f740c2
AdvisorChainFactory源码分析
Apr 19, 2024
2be5b63
AopProxy源码分析
Apr 19, 2024
57f1c25
AopProxy源码分析
Apr 22, 2024
d229b33
AopProxy源码分析
Apr 22, 2024
4332fef
Advised源码分析
Apr 22, 2024
00a5735
AopContext源码分析
Apr 22, 2024
721e928
AopContext源码分析
Apr 22, 2024
06a981d
TargetSourceCreator源码分析
Apr 22, 2024
431ca04
ExposeInvocationInterceptor源码分析
Apr 23, 2024
6a62d8e
AopProxy源码分析
Apr 23, 2024
41b7bf0
AopProxyFactory源码分析
Apr 23, 2024
f8a2414
ClassFilter优化
Apr 23, 2024
0150a68
ClassFilter优化
Apr 23, 2024
3fdf1ca
ClassFilter优化
Apr 23, 2024
f1a682e
Pointcut优化
Apr 23, 2024
535c2a1
Pointcut优化
Apr 23, 2024
06f63fe
MethodInterceptor优化
Apr 23, 2024
03108fd
MethodInterceptor优化
Apr 23, 2024
fa68989
MethodBeforeAdvice优化
Apr 23, 2024
dbbbe5d
AfterReturningAdvice优化
Apr 23, 2024
dff5fdf
ThrowsAdvice优化
Apr 23, 2024
76d5a7a
IntroductionInterceptor优化
Apr 23, 2024
26e0974
AdvisorAdapter源码分析优化
Apr 25, 2024
1b08aae
Pointcut优化
Apr 26, 2024
4fdff4a
Pointcut优化
Apr 26, 2024
38cf77a
ClassFilter优化
Apr 26, 2024
0ce87ed
MethodMatcher优化
Apr 26, 2024
db9566f
调整目录结构
Apr 26, 2024
c0c741e
调整目录结构
Apr 26, 2024
afb4410
Advisor优化
Apr 26, 2024
7c7d373
Advice源码分析
Apr 26, 2024
706dddd
Advice源码分析
Apr 26, 2024
ec50207
Advice优化
Apr 28, 2024
521f821
Advice优化目录
Apr 28, 2024
349fa99
ProxyFactory优化
Apr 28, 2024
4cecf13
调整目录优化
Apr 28, 2024
8b7c4a3
ProxyMethodInvocation源码分析
Apr 28, 2024
2c28a1c
ProxyMethodInvocation源码分析
Apr 28, 2024
31de26a
ProxyMethodInvocation源码分析
Apr 28, 2024
94547e0
Advisor优化
Apr 29, 2024
9186e1d
Advised优化
Apr 29, 2024
48d538e
ClassFilter优化
Apr 29, 2024
f7c9259
MethodMatcher优化
Apr 29, 2024
10dc5e3
MethodMatcher优化
Apr 29, 2024
c957d39
Pointcut优化
Apr 29, 2024
84251ad
MethodInterceptor优化
Apr 29, 2024
1b5b4fd
MethodBeforeAdvice优化
Apr 29, 2024
78363c3
MethodBeforeAdvice优化
Apr 29, 2024
780e96a
AfterReturningAdvice优化
Apr 29, 2024
0b8e235
AfterReturningAdvice优化
Apr 29, 2024
7ce2146
ProxyFactory优化
Apr 29, 2024
b8552e2
ProxyFactory优化
Apr 29, 2024
af1574d
AopProxyFactory优化
Apr 29, 2024
80b2d55
AopProxy优化
Apr 29, 2024
413c05e
AopProxy优化
Apr 29, 2024
1457b02
AopProxyFactory优化
Apr 29, 2024
2a30eda
优化目录
Apr 29, 2024
74c7f57
AdvisorChainFactory优化
Apr 29, 2024
b105904
AdvisorAdapterRegistry优化
Apr 29, 2024
0620fea
AdvisorAdapter优化
Apr 29, 2024
56740d4
ProxyMethodInvocation优化
Apr 29, 2024
7164746
EnableAspectJAutoProxy优化
May 6, 2024
99249af
EnableAspectJAutoProxy优化
May 6, 2024
f9b1f6d
AspectInstanceFactory优化
May 7, 2024
e57e81c
TargetSourceCreator优化
May 7, 2024
0ada3c6
ExposeInvocationInterceptor优化
May 7, 2024
2413795
Pointcut优化
May 7, 2024
ed494ca
EnableLoadTimeWeaving优化
May 7, 2024
d039294
更新二维码
May 17, 2024
ef78419
spring事务源码分析
May 28, 2024
8dba510
spring事务源码分析
May 28, 2024
b451fa6
调整项目依赖
May 28, 2024
688f4dc
优化排版
May 29, 2024
aa4ade2
优化排版
May 29, 2024
5c964ae
优化排版
May 29, 2024
f160137
优化排版
May 29, 2024
b319cb5
优化排版
May 29, 2024
d229cb3
更新群二维码
Jun 28, 2024
05d3f86
更新群二维码
Jun 28, 2024
ba4446d
更新群二维码
Jun 28, 2024
a39635a
更新群二维码
Jun 28, 2024
84ee0bd
HelloGitHub 徽章
Jun 28, 2024
a790c79
HelloGitHub 徽章
Jun 28, 2024
08e6310
HelloGitHub 徽章
Jun 28, 2024
4c83dd0
Update README.md
521xueweihan Jul 4, 2024
9911cbb
Merge pull request #32 from 521xueweihan/patch-1
xuchengsheng Jul 5, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
142 changes: 90 additions & 52 deletions README.md

Large diffs are not rendered by default.

Binary file removed image/wechat-group.jpg
Binary file not shown.
Binary file added image/wechat-mp.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added image/wechat.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
33 changes: 13 additions & 20 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,9 @@
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<java.version>11</java.version>
<spring.version>5.3.10</spring.version>
<spring.version>5.2.15.RELEASE</spring.version>
<mysql.version>8.0.30</mysql.version>
<spring.boot.version>2.3.12.RELEASE</spring.boot.version>
</properties>

<modules>
Expand All @@ -33,33 +35,24 @@
<module>spring-env</module>
<module>spring-dataops</module>
<module>spring-spel</module>
<module>spring-transaction</module>
</modules>

<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>${spring.boot.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>${spring.version}</version>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
<version>${spring.boot.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
<version>${spring.boot.version}</version>
</dependency>
</dependencies>

Expand Down
30 changes: 30 additions & 0 deletions spring-aop/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,36 @@
<modules>
<module>spring-aop-advisor</module>
<module>spring-aop-pointcut</module>
<module>spring-aop-advisorAdapter</module>
<module>spring-aop-targetSource</module>
<module>spring-aop-aopProxy</module>
<module>spring-aop-classFilter</module>
<module>spring-aop-methodMatcher</module>
<module>spring-aop-jdkProxy</module>
<module>spring-aop-cglibProxy</module>
<module>spring-aop-enableAspectJAutoProxy</module>
<module>spring-aop-enableLoadTimeWeaving</module>
<module>spring-aop-advice-methodInterceptor</module>
<module>spring-aop-advice-methodBeforeAdvice</module>
<module>spring-aop-advice-afterReturningAdvice</module>
<module>spring-aop-advice-throwsAdvice</module>
<module>spring-aop-advice-introductionInterceptor</module>
<module>spring-aop-aopProxyFactory</module>
<module>spring-aop-annotationAwareAspectJAutoProxyCreator</module>
<module>spring-aop-aspectInstanceFactory</module>
<module>spring-aop-metadataAwareAspectInstanceFactory</module>
<module>spring-aop-aspectJAdvisorFactory</module>
<module>spring-aop-beanFactoryAspectJAdvisorsBuilder</module>
<module>spring-aop-beanFactoryAdvisorRetrievalHelper</module>
<module>spring-aop-proxyFactory</module>
<module>spring-aop-advisorChainFactory</module>
<module>spring-aop-advisorAdapterRegistry</module>
<module>spring-aop-advised</module>
<module>spring-aop-aopContext</module>
<module>spring-aop-targetSourceCreator</module>
<module>spring-aop-exposeInvocationInterceptor</module>
<module>spring-aop-advice</module>
<module>spring-aop-proxyMethodInvocation</module>
</modules>

<modelVersion>4.0.0</modelVersion>
Expand Down
143 changes: 143 additions & 0 deletions spring-aop/spring-aop-advice-afterReturningAdvice/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,143 @@
## AfterReturningAdvice

- [AfterReturningAdvice](#afterreturningadvice)
- [一、基本信息](#一基本信息)
- [二、基本描述](#二基本描述)
- [三、主要功能](#三主要功能)
- [四、接口源码](#四接口源码)
- [五、主要实现](#五主要实现)
- [六、类关系图](#六类关系图)
- [七、最佳实践](#七最佳实践)

### 一、基本信息

✒️ **作者** - Lex 📝 **博客** - [掘金](https://juejin.cn/user/4251135018533068/posts) 📚 **源码地址** - [github](https://github.com/xuchengsheng/spring-reading)

### 二、基本描述

`AfterReturningAdvice`接口是Spring AOP框架中的一个核心接口,用于在目标方法执行后拦截并执行自定义逻辑。通过实现该接口的`afterReturning`方法,可以在目标方法成功返回结果后进行一些操作。

### 三、主要功能

1. **日志记录**

+ 记录目标方法的执行情况,如方法名称、参数值、返回结果等,以便跟踪应用程序的运行状态。

2. **性能监控**
+ 统计目标方法的执行时间,分析应用程序的性能瓶颈,优化程序性能。

3. **缓存处理**

+ 在方法返回结果后,将结果缓存起来,以提高后续相同请求的响应速度。

4. **统一处理**

+ 执行一些与业务逻辑无关的统一处理,如资源释放、清理等。

### 四、接口源码

`AfterReturningAdvice`接口主要用于在方法正常返回时执行后置通知。后置通知可以查看方法的返回值,但不能修改它,并且仅在方法正常返回时被调用,不会在抛出异常时被调用。该接口提供了一个`afterReturning`方法,在方法成功返回后进行回调,其中包含了返回值、被调用的方法、方法的参数以及方法调用的目标对象等信息。

```java
/**
* 后置返回通知仅在方法正常返回时被调用,如果抛出异常则不会被调用。这样的通知可以查看方法的返回值,但不能修改它。
*
* 作者:Rod Johnson
* @see MethodBeforeAdvice
* @see ThrowsAdvice
*/
public interface AfterReturningAdvice extends AfterAdvice {

/**
* 在给定方法成功返回后的回调。
* @param returnValue 方法返回的值,如果有的话
* @param method 被调用的方法
* @param args 方法的参数
* @param target 方法调用的目标对象。可能为{@code null}。
* @throws Throwable 如果此对象希望中止调用。如果方法签名允许,将返回任何抛出的异常给调用者。否则,异常将被包装为运行时异常。
*/
void afterReturning(@Nullable Object returnValue, Method method, Object[] args, @Nullable Object target) throws Throwable;

}
```

### 五、主要实现

1. **AspectJAfterReturningAdvice**

+ 实现了返回后通知,使用 AspectJ 风格定义的通知,用于在目标方法成功执行并返回结果后执行额外的逻辑。

### 六、类关系图

~~~mermaid
classDiagram
direction BT
class Advice {
<<Interface>>

}
class AfterAdvice {
<<Interface>>

}
class AfterReturningAdvice {
<<Interface>>

}
class AspectJAfterReturningAdvice

AfterAdvice --> Advice
AfterReturningAdvice --> AfterAdvice
AspectJAfterReturningAdvice ..> Advice
AspectJAfterReturningAdvice ..> AfterAdvice
AspectJAfterReturningAdvice ..> AfterReturningAdvice
~~~

### 七、最佳实践

使用Spring AOP中的后置返回通知(AfterReturningAdvice)。首先,创建了一个代理工厂(ProxyFactory)并指定目标对象(MyService)。然后,创建了一个后置返回通知(MyAfterReturningAdvice)并添加到代理工厂中。接着,通过代理工厂获取代理对象,并调用代理对象的方法。

```java
public class AfterReturningAdviceDemo {

public static void main(String[] args) {
// 创建代理工厂&创建目标对象
ProxyFactory proxyFactory = new ProxyFactory(new MyService());
// 创建通知
proxyFactory.addAdvice(new MyAfterReturningAdvice());
// 获取代理对象
MyService proxy = (MyService) proxyFactory.getProxy();
// 调用代理对象的方法
proxy.foo();
}
}
```

`MyAfterReturningAdvice`的类,它实现了Spring AOP框架中的`AfterReturningAdvice`接口。在`afterReturning`方法中,当目标方法成功返回结果时,它将打印出目标方法的名称以及返回的值。

```java
public class MyAfterReturningAdvice implements AfterReturningAdvice {
@Override
public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable {
System.out.println("After Method " + method.getName());
}
}
```

`MyService` 类是一个简单的服务类,其中包含了一个名为 `foo()` 的方法。在上下文中,`MyService` 类被用作目标对象,即需要被拦截和增强的对象。

```java
public class MyService {

public void foo() {
System.out.println("foo...");
}
}
```

运行结果,成功地执行了代理对象的`foo()`方法,并在方法执行完成后,后置返回通知`MyAfterReturningAdvice`被触发。

```java
foo...
After Method foo
```
14 changes: 14 additions & 0 deletions spring-aop/spring-aop-advice-afterReturningAdvice/pom.xml
Original file line number Diff line number Diff line change
@@ -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-afterReturningAdvice</artifactId>

</project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.xcs.spring;

import org.springframework.aop.framework.ProxyFactory;

public class AfterReturningAdviceDemo {

public static void main(String[] args) {
// 创建代理工厂&创建目标对象
ProxyFactory proxyFactory = new ProxyFactory(new MyService());
// 创建通知
proxyFactory.addAdvice(new MyAfterReturningAdvice());
// 获取代理对象
MyService proxy = (MyService) proxyFactory.getProxy();
// 调用代理对象的方法
proxy.foo();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.xcs.spring;

import org.springframework.aop.AfterReturningAdvice;

import java.lang.reflect.Method;

public class MyAfterReturningAdvice implements AfterReturningAdvice {
@Override
public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable {
System.out.println("After Method " + method.getName());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.xcs.spring;

public class MyService {

public void foo() {
System.out.println("foo...");
}
}
Loading