Skip to content

Commit 5574de7

Browse files
committed
update spring-aop README.md spring-projects#1
1 parent 6b70df9 commit 5574de7

File tree

6 files changed

+37
-1
lines changed

6 files changed

+37
-1
lines changed

spring-aop/doc/README.md

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,34 @@
44

55
todo
66

7+
### 几种通知类型的执行顺序
8+
9+
todo
10+
11+
### AOP的整个流程
12+
13+
XML方式(以测试资源目录下的 `aopExample.xml` 中的 `testBean` 的获取为例 ):
14+
15+
1. 解析XML文件时,在 `AopNamespaceHandler#init` 中注册 `<aop:aspectj-autoproxy />` 标签对应的解析器 `AspectJAutoProxyBeanDefinitionParser`
16+
17+
![aop#1](resources/2022-03-29_21-19.png)
18+
19+
2. 调用 `AspectJAutoProxyBeanDefinitionParser#parse` 方法注册 `AnnotationAwareAspectJAutoProxyCreator`
20+
21+
![aop#2](resources/2022-03-29_21-26.png)
22+
23+
3. 因为 `AnnotationAwareAspectJAutoProxyCreator` 实现了 `BeanPostProcessor` 接口,所以会在 `AbstractApplicationContext#registerBeanPostProcessors` 中把它注册到 `AbstractBeanFactory``beanPostProcessors` 属性中
24+
25+
![aop#3](resources/2022-03-29_21-41.png)
26+
27+
4. 又因为 `AnnotationAwareAspectJAutoProxyCreator` 实现的是 `BeanPostProcessor` 的子接口 `InstantiationAwareBeanPostProcessor` ,所以在获取bean时,它的 `applyBeanPostProcessorsBeforeInstantiation` 方法和 `applyBeanPostProcessorsAfterInitialization` 方法会被 `AbstractAutowireCapableBeanFactory#resolveBeforeInstantiation` 调用
28+
29+
![aop#4](resources/2022-03-29_21-54.png)
30+
31+
5.
32+
33+
### AOP概念与Spring中实现的对应关系
34+
35+
* 切面 —— `@Aspect` 注解、 `Advisor` 接口及其实现类
36+
* 通知 —— `Advice` 接口及其实现类、 `@Before``@After``@Around``@AfterThrowing``@AfterReturing` 注解
37+
*
102 KB
Loading
76 KB
Loading
62.4 KB
Loading
91.6 KB
Loading

spring-context/src/main/java/org/springframework/context/weaving/AspectJWeavingEnabler.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,10 @@ public static void enableAspectJWeaving(
9797
throw new IllegalStateException("No LoadTimeWeaver available");
9898
}
9999
}
100+
/**
101+
* <p>使用 {@link DefaultContextLoadTimeWeaver} 类型bean中的
102+
* {@link DefaultContextLoadTimeWeaver#loadTimeWeaver} 属性注册转换器</p>
103+
* */
100104
weaverToUse.addTransformer(
101105
new AspectJClassBypassingClassFileTransformer(new ClassPreProcessorAgentAdapter()));
102106
}
@@ -118,10 +122,11 @@ public AspectJClassBypassingClassFileTransformer(ClassFileTransformer delegate)
118122
@Override
119123
public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined,
120124
ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException {
121-
125+
// 以org.aspectj或org/aspectj开头的类不进行处理
122126
if (className.startsWith("org.aspectj") || className.startsWith("org/aspectj")) {
123127
return classfileBuffer;
124128
}
129+
// 委托给AspectJ代理继续处理
125130
return this.delegate.transform(loader, className, classBeingRedefined, protectionDomain, classfileBuffer);
126131
}
127132
}

0 commit comments

Comments
 (0)