mirror of
https://github.com/youthlql/JavaYouth.git
synced 2026-04-19 01:23:39 +00:00
图床修改
This commit is contained in:
@@ -222,7 +222,7 @@ class AspectJAutoProxyRegistrar implements ImportBeanDefinitionRegistrar {
|
||||
|
||||
### Debug调用栈
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_06/image-20211010202000109.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_06/image-20211010202000109.png"/>
|
||||
|
||||
### ImportBeanDefinitionRegistrar
|
||||
|
||||
@@ -290,7 +290,7 @@ pos_1 Debug进去是下面的方法
|
||||
|
||||
### AnnotationAwareAspectJAutoProxyCreator后置处理器
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_06/image-20211010202725286.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_06/image-20211010202725286.png"/>
|
||||
|
||||
我们发现这就是一个后置处理器,印证了我们之前说过的几乎所有功能增强或功能附加都是由后置处理器来完成
|
||||
|
||||
@@ -318,13 +318,13 @@ pos_1 Debug进去是下面的方法
|
||||
|
||||
##### 作用
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_06/image-20211011222513844.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_06/image-20211011222513844.png"/>
|
||||
|
||||
1. 由于它是后置处理器所以肯定是在refresh方法里的registerBeanPostProcessors这一步开始干活的
|
||||
2. 果然是从getBean调用到了我们的重写方法断点处,也就验证了我们上面说怎么分析。绿色包含的前面已经讲过,不再赘述。
|
||||
3. 也确实是AnnotationAwareAspectJAutoProxyCreator,走到这里说明前面已经创建出了AnnotationAwareAspectJAutoProxyCreator对象(前面怎么创建的,getbean的流程之前已经讲的很清楚了),后面只是对AnnotationAwareAspectJAutoProxyCreator进行初始化
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_06/image-20211011225209123.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_06/image-20211011225209123.png" />
|
||||
|
||||
##### AbstractAutowireCapableBeanFactory#initializeBean()进行初始化
|
||||
|
||||
@@ -410,7 +410,7 @@ pos_1 Debug进去是下面的方法
|
||||
}
|
||||
```
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_06/image-20211011223856339.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_06/image-20211011223856339.png" />
|
||||
|
||||
```java
|
||||
public ReflectiveAspectJAdvisorFactory(@Nullable BeanFactory beanFactory) {
|
||||
@@ -483,7 +483,7 @@ public ReflectiveAspectJAdvisorFactory(@Nullable BeanFactory beanFactory) {
|
||||
}
|
||||
```
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_06/image-20211011224506258.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_06/image-20211011224506258.png"/>
|
||||
|
||||
1. 我们来看一下是什么时候触发的,看图中的beanName==myBeanPostProcessor时触发的,也就是创建完AnnotationAwareAspectJAutoProxyCreator,第一次创建别的后置处理器时触发的。
|
||||
2. 这里虽然开始参与其它Bean的创建过程,但也可能是什么都没做。
|
||||
@@ -610,7 +610,7 @@ protected boolean isInfrastructureClass(Class<?> beanClass) {
|
||||
|
||||
#### Debug调用栈-调用aspectJAdvisorsBuilder的findCandidateAdvisors()方法
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_06/image-20211011230711617.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_06/image-20211011230711617.png"/>
|
||||
|
||||
AbstractAutoProxyCreator#postProcessBeforeInstantiation()这个方法,上面刚分析过,这次来分析shouldskip()
|
||||
|
||||
@@ -633,7 +633,7 @@ AbstractAutoProxyCreator#postProcessBeforeInstantiation()这个方法,上面
|
||||
|
||||
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_06/image-20211011230223566.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_06/image-20211011230223566.png"/>
|
||||
|
||||
它进去的时候就是beanName==LogAspect,我们看看它是怎么判断的
|
||||
|
||||
@@ -653,7 +653,7 @@ AbstractAutoProxyCreator#postProcessBeforeInstantiation()这个方法,上面
|
||||
|
||||
我们这里先放行,看构造了哪些增强器
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_06/image-20211011233722352.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_06/image-20211011233722352.png"/>
|
||||
|
||||
##### BeanFactoryAspectJAdvisorsBuilder#buildAspectJAdvisors()找到切面,并创建增强器advisors
|
||||
|
||||
@@ -738,11 +738,11 @@ AbstractAutoProxyCreator#postProcessBeforeInstantiation()这个方法,上面
|
||||
|
||||
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_06/image-20211011232136364.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_06/image-20211011232136364.png"/>
|
||||
|
||||
for循环所有组件之后,有切面的话,就赋值,然后aspectNames
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_06/image-20211011232645429.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_06/image-20211011232645429.png"/>
|
||||
|
||||
#### 结论
|
||||
|
||||
@@ -939,7 +939,7 @@ AbstractAutoProxyCreator
|
||||
|
||||
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_06/image-20211012113939403.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_06/image-20211012113939403.png"/>
|
||||
|
||||
|
||||
|
||||
@@ -981,21 +981,21 @@ AbstractAutoProxyCreator
|
||||
|
||||
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_06/image-20211012115005897.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_06/image-20211012115005897.png"/>
|
||||
|
||||
|
||||
|
||||
获取父类的方法
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_06/image-20211012115205531.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_06/image-20211012115205531.png"/>
|
||||
|
||||
然后回到这里
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_06/image-20211012142115626.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_06/image-20211012142115626.png"/>
|
||||
|
||||
最后回到这个for循环,循环所有的方法
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_06/image-20211012142802483.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_06/image-20211012142802483.png"/>
|
||||
|
||||
#### ReflectiveAspectJAdvisorFactory#getAdvisor()
|
||||
|
||||
@@ -1126,7 +1126,7 @@ AbstractAutoProxyCreator
|
||||
|
||||
到了初始化这里了,说明前面无参构造创建myBeanPostProcessor对象已经完成了
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_06/image-20211011233400056.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_06/image-20211011233400056.png"/>
|
||||
|
||||
#### AnnotationAwareAspectJAutoProxyCreator#findCandidateAdvisors()
|
||||
|
||||
@@ -1148,7 +1148,7 @@ protected List<Advisor> findCandidateAdvisors() {
|
||||
|
||||
我们这里先放行,看构造了哪些增强器
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_06/image-20211011233722352.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_06/image-20211011233722352.png"/>
|
||||
|
||||
#### BeanFactoryAspectJAdvisorsBuilder#buildAspectJAdvisors()
|
||||
|
||||
@@ -1246,7 +1246,7 @@ protected List<Advisor> findCandidateAdvisors() {
|
||||
finishBeanFactoryInitialization(beanFactory);
|
||||
```
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_06/image-20211012153225770.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_06/image-20211012153225770.png" />
|
||||
|
||||
### 创建HelloService代理对象之前的工作
|
||||
|
||||
@@ -1254,25 +1254,25 @@ finishBeanFactoryInitialization(beanFactory);
|
||||
|
||||
我们在诸如下面的地方打上条件断点`beanName.equals("helloService") || beanName.equals("logAspect")`
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_06/image-20211012153646657.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_06/image-20211012153646657.png"/>
|
||||
|
||||
debug放行
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_06/image-20211012154005700.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_06/image-20211012154005700.png"/>
|
||||
|
||||
|
||||
|
||||
往下走进入getBean()
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_06/image-20211012154205498.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_06/image-20211012154205498.png"/>
|
||||
|
||||
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_06/image-20211012154413318.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_06/image-20211012154413318.png" />
|
||||
|
||||
走到熟悉的createbean
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_06/image-20211012155231730.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_06/image-20211012155231730.png"/>
|
||||
|
||||
我们以前讲过resolveBeforeInstantiation是返回代理对象的机会,我们现在来看一下AOP有没有在这里给helloService返回代理对象。F7进入此方法
|
||||
|
||||
@@ -1302,25 +1302,25 @@ debug放行
|
||||
}
|
||||
```
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_06/image-20211012160014471.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_06/image-20211012160014471.png"/>
|
||||
|
||||
这是有一个负责AOP功能的后置处理器,就是我们前面说的那个
|
||||
|
||||
当循环到这个后置处理器的时候,我们进入方法
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_06/image-20211012161510441.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_06/image-20211012161510441.png"/>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_06/image-20211012161817522.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_06/image-20211012161817522.png"/>
|
||||
|
||||
|
||||
|
||||
我debug完之后发现前置过程啥也没干,返回了个NULL。什么都没干的原因就是**负责AOP功能的后置处理器第一次运行准备好数据**和**构建增强器**这两步已经干过了
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_06/image-20211012162158546.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_06/image-20211012162158546.png"/>
|
||||
|
||||
|
||||
|
||||
@@ -1329,11 +1329,11 @@ debug放行
|
||||
1. 最后我们惊奇的发现,AOP的后置处理器在resolveBeforeInstantiation这一步竟然没有返回代理对象,这可能跟大部分人想的有出入。
|
||||
2. 想一下为什么没有返回代理对象?走到这一步的时候,咱们的HelloService对象都还没有创建,更没有赋值,初始化。你如果在这里直接返回代理对象,那假设HelloService还注入了其它组件,那你返回的代理对象不就没有这些组件了嘛?直接跳过了。
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_06/image-20211012163220063.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_06/image-20211012163220063.png"/>
|
||||
|
||||
往下走,创建一个最原始的对象
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_06/image-20211012165217922.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_06/image-20211012165217922.png" />
|
||||
|
||||
#### 赋值
|
||||
|
||||
@@ -1341,15 +1341,15 @@ debug放行
|
||||
|
||||
往下走进入赋值环节
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_06/image-20211012165702336.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_06/image-20211012165702336.png" />
|
||||
|
||||
我们来看下AOP的后置处理器在这一步有没有做事
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_06/image-20211012165933421.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_06/image-20211012165933421.png"/>
|
||||
|
||||
啥事没干,直接返回
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_06/image-20211012170025142.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_06/image-20211012170025142.png"/>
|
||||
|
||||
|
||||
|
||||
@@ -1359,15 +1359,15 @@ debug放行
|
||||
|
||||
#### 初始化
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_06/image-20211012170944132.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_06/image-20211012170944132.png"/>
|
||||
|
||||
进入之后发现,AOP的后置处理器在此介入了,我们再进去看下到底做了啥
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_06/image-20211012171702722.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_06/image-20211012171702722.png"/>
|
||||
|
||||
啥也没做,直接返回原生Bean
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_06/image-20211012171813664.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_06/image-20211012171813664.png" />
|
||||
|
||||
|
||||
|
||||
@@ -1376,11 +1376,11 @@ debug放行
|
||||
|
||||
##### applyBeanPostProcessorsAfterInitialization后置初始化方法
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_06/image-20211012172107405.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_06/image-20211012172107405.png" />
|
||||
|
||||
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_06/image-20211012172308103.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_06/image-20211012172308103.png"/>
|
||||
|
||||
F7进入方法
|
||||
|
||||
@@ -1471,7 +1471,7 @@ F7进入方法
|
||||
|
||||
我发现他调用了咱们之前讲过的方法
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_06/image-20211012173003595.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_06/image-20211012173003595.png" />
|
||||
|
||||
因为之前调用过,缓存中有,直接返回
|
||||
|
||||
@@ -1520,7 +1520,7 @@ F7进入方法
|
||||
}
|
||||
```
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_06/image-20211012173631784.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_06/image-20211012173631784.png"/>
|
||||
|
||||
|
||||
|
||||
@@ -1568,7 +1568,7 @@ F7进入方法
|
||||
|
||||
接着我们返回到这一步,看到了这几个增强器
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_06/image-20211012174251200.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_06/image-20211012174251200.png" />
|
||||
|
||||
这里又有一个重要方法
|
||||
|
||||
@@ -1605,11 +1605,11 @@ F7进入方法
|
||||
}
|
||||
```
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_06/image-20211012174626015.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_06/image-20211012174626015.png" />
|
||||
|
||||
回到AbstractAutoProxyCreator#wrapIfNecessary,调用下面的方法真正开始创建代理对象
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_06/image-20211012191915487.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_06/image-20211012191915487.png"/>
|
||||
|
||||
##### AbstractAutoProxyCreator#createProxy()开始创建代理对象
|
||||
|
||||
@@ -1761,27 +1761,27 @@ F7进入方法
|
||||
|
||||
最后返回
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_06/image-20211012193828795.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_06/image-20211012193828795.png" />
|
||||
|
||||
|
||||
|
||||
继续返回
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_06/image-20211012194036836.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_06/image-20211012194036836.png"/>
|
||||
|
||||
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_06/image-20211012194217705.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_06/image-20211012194217705.png"/>
|
||||
|
||||
最终单例池里就有代理对象了
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_06/image-20211012194446377.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_06/image-20211012194446377.png"/>
|
||||
|
||||
##### logAspect创建原生对象,而不是代理对象
|
||||
|
||||
logAspect切面对象最后创建的是原生对象,如下图,因为他不需要代理
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_06/image-20211012194718066.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_06/image-20211012194718066.png" />
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user