mirror of
https://github.com/youthlql/JavaYouth.git
synced 2026-06-15 20:07:04 +00:00
图床修改
This commit is contained in:
@@ -38,7 +38,7 @@ Spring源码纵览这一节,主要是先了解下Spring的一些核心东西
|
||||
|
||||
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_01/image-20210926195844253.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_01/image-20210926195844253.png" />
|
||||
|
||||
- **蓝色实线箭头**是指继承关系
|
||||
- **绿色虚线箭头**是指接口实现关系
|
||||
@@ -91,13 +91,13 @@ BeanPostProcessor
|
||||
|
||||
快捷键:ctrl+F12 看类的方法
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_01/image-20210926232957909.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_01/image-20210926232957909.png"/>
|
||||
|
||||
#### 实现类
|
||||
|
||||
快捷键:ctrl+h 查看接口实现类
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_01/image-20210926233308861.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_01/image-20210926233308861.png"/>
|
||||
|
||||
|
||||
|
||||
@@ -189,7 +189,7 @@ public interface ResourceLoader {
|
||||
|
||||
#### 实现类
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_01/image-20210926234527992.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_01/image-20210926234527992.png" />
|
||||
|
||||
|
||||
|
||||
@@ -232,7 +232,7 @@ public interface BeanFactory {
|
||||
|
||||
> 源码分析小技巧:看源码时,我们可以先看一个类的接口继承关系,因为接口就是规范,大部分开源框架源码都是遵守这一规范的。
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_01/image-20210927103844753.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_01/image-20210927103844753.png" />
|
||||
|
||||
|
||||
|
||||
@@ -248,7 +248,7 @@ public interface BeanFactory {
|
||||
|
||||
#### AbstractApplicationContext
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_01/image-20210927104922679.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_01/image-20210927104922679.png" />
|
||||
|
||||
环境类的意思就是谁持有这个策略;这里就解释了上文说ResourceLoader是环境类接口
|
||||
|
||||
@@ -265,7 +265,7 @@ public interface BeanFactory {
|
||||
|
||||
#### GenericApplicationContext
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_01/image-20210927105641446.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_01/image-20210927105641446.png"/>
|
||||
|
||||
这里组合了DefaultListableBeanFactory
|
||||
|
||||
@@ -310,7 +310,7 @@ public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFacto
|
||||
|
||||
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_01/image-20210927110806180.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_01/image-20210927110806180.png" />
|
||||
|
||||
1. BeanDefinitionRegistry:Bean定义信息注册中心
|
||||
2. SimpleAliasRegistry:别名注册中心
|
||||
@@ -336,7 +336,7 @@ public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFacto
|
||||
|
||||
#### 流程图-BeanDefinition注册流程
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.7/spring-sourcecode-v1/flow_chart/Spring%E6%BA%90%E7%A0%81-BeanDefinition%E6%B3%A8%E5%86%8C%E6%B5%81%E7%A8%8B.png">
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.7/spring-sourcecode-v1/flow_chart/Spring%E6%BA%90%E7%A0%81-BeanDefinition%E6%B3%A8%E5%86%8C%E6%B5%81%E7%A8%8B.png">
|
||||
|
||||
- 我们要看BeanDefinition是何时被放入到beanDefinitionMap,只需要在DefaultListableBeanFactory用到`beanDefinitionMap.put()`的地方打个断点。
|
||||
- 我们在DefaultListableBeanFactory里搜索,发现了registerBeanDefinition(注册Bean定义信息)这个方法名很像我们要找的东西,再看里面的代码,果然有`beanDefinitionMap.put()`这串代码,我们试着在这里打个断点
|
||||
@@ -361,7 +361,7 @@ public class MainTest {
|
||||
|
||||
#### Debug调用栈
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_01/image-20210927142317864.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_01/image-20210927142317864.png" />
|
||||
|
||||
> 调用栈的调用顺序已经非常清楚了,可以把图放大一点看,下面只说一些必要的信息。
|
||||
|
||||
@@ -780,7 +780,7 @@ public class MainTest {
|
||||
- 还有一个debug的猜测方向,想要注册BeanDefinition肯定要new,我们可以直接在AbstractBeanDefinition这个抽象父类的构造函数打断点,我们不知道会走哪个构造函数,所以给三个构造函数都打断点。
|
||||
- 下面就是打完断点之后,运行MainTest测试类后的调用栈
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_01/image-20210927172855410.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_01/image-20210927172855410.png"/>
|
||||
|
||||
|
||||
|
||||
@@ -936,7 +936,7 @@ public class MainTest {
|
||||
|
||||
### ApplicationContext接口功能
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_01/image-20210927175207106.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_01/image-20210927175207106.png" />
|
||||
|
||||
1. ioc事件派发器
|
||||
2. 国际化解析
|
||||
@@ -969,7 +969,7 @@ public interface Aware {
|
||||
2. 注释的大致意思是:Aware是一个标记性的超接口(顶级接口),指示了一个Bean有资格通过回调方法的形式获取Spring容器底层组件。实际回调方法被定义在每一个子接口中,而且通常一个子接口只包含一个接口一个参数并且返回值为void的方法。
|
||||
3. 说白了:只要实现了Aware子接口的Bean都能获取到一个Spring底层组件。
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_01/image-20210927191112023.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_01/image-20210927191112023.png" />
|
||||
|
||||
比如实现了ApplicationContextAware接口,实现它的方法,就能通过回调机制拿到ApplicationContext
|
||||
|
||||
@@ -979,7 +979,7 @@ public interface Aware {
|
||||
|
||||
##### 流程图-Bean对象创建流程
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.7/spring-sourcecode-v1/flow_chart/Spring%E6%BA%90%E7%A0%81-Bean%E5%AF%B9%E8%B1%A1%E5%88%9B%E5%BB%BA%E6%B5%81%E7%A8%8B.png">
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.7/spring-sourcecode-v1/flow_chart/Spring%E6%BA%90%E7%A0%81-Bean%E5%AF%B9%E8%B1%A1%E5%88%9B%E5%BB%BA%E6%B5%81%E7%A8%8B.png">
|
||||
|
||||
##### Debug调用栈
|
||||
|
||||
@@ -1055,7 +1055,7 @@ public class MainConfig {
|
||||
|
||||
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_01/image-20210927200211334.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_01/image-20210927200211334.png" />
|
||||
|
||||
1. 有一些一样的东西不再赘述
|
||||
2. 在`AbstractApplicationContext#refresh()`里会调用
|
||||
@@ -1267,7 +1267,7 @@ public class MainConfig {
|
||||
|
||||
##### Debug调用栈
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_01/image-20210927230734973.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_01/image-20210927230734973.png"/>
|
||||
|
||||
|
||||
|
||||
@@ -1434,7 +1434,7 @@ public class MainTest {
|
||||
|
||||
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_01/image-20210928113235852.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_01/image-20210928113235852.png" />
|
||||
|
||||
|
||||
|
||||
@@ -1475,7 +1475,7 @@ public class MainTest {
|
||||
|
||||
我们看到此时,Person的name属性还是null
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_01/image-20210928114746618.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_01/image-20210928114746618.png" />
|
||||
|
||||
|
||||
|
||||
@@ -1497,7 +1497,7 @@ public class MainTest {
|
||||
|
||||
这里拿到属性值
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_01/image-20210928115110820.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_01/image-20210928115110820.png" />
|
||||
|
||||
|
||||
|
||||
@@ -1512,13 +1512,13 @@ public class MainTest {
|
||||
}
|
||||
```
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_01/image-20210928115352416.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_01/image-20210928115352416.png"/>
|
||||
|
||||
|
||||
|
||||
bw就是上面说的 => 里面封装好了真正的Person对象
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_01/image-20210928115702735.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_01/image-20210928115702735.png"/>
|
||||
|
||||
|
||||
|
||||
@@ -1528,7 +1528,7 @@ bw就是上面说的 => 里面封装好了真正的Person对象
|
||||
|
||||
这里就是一层一层调,不重要跳过。
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_01/image-20210928120016581.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_01/image-20210928120016581.png" />
|
||||
|
||||
|
||||
|
||||
@@ -1549,7 +1549,7 @@ private void processLocalProperty(PropertyTokenHolder tokens, PropertyValue pv)
|
||||
|
||||
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_01/image-20210928141536440.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_01/image-20210928141536440.png"/>
|
||||
|
||||
|
||||
|
||||
@@ -1588,7 +1588,7 @@ private class BeanPropertyHandler extends PropertyHandler {
|
||||
|
||||
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_01/image-20210928143301161.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_01/image-20210928143301161.png"/>
|
||||
|
||||
最后就是反射走到了我们的`Person#setName(String name)`
|
||||
|
||||
@@ -1598,7 +1598,7 @@ private class BeanPropertyHandler extends PropertyHandler {
|
||||
|
||||
### 再来看看messageSource何时赋值
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_01/image-20210928143910461.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_01/image-20210928143910461.png" />
|
||||
|
||||
|
||||
|
||||
@@ -1742,7 +1742,7 @@ public class Person implements ApplicationContextAware, MessageSourceAware {
|
||||
|
||||
老样子,只看不一样的调用栈
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_01/image-20210928151825366.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_01/image-20210928151825366.png"/>
|
||||
|
||||
### AbstractAutowireCapableBeanFactory#populateBean()
|
||||
|
||||
@@ -1785,7 +1785,7 @@ public class Person implements ApplicationContextAware, MessageSourceAware {
|
||||
|
||||
这里有一个非常著名的后置处理器,`AutowiredAnnotationBeanPostProcessor`自动装配注解后置处理器,顾名思义就是用来处理@Autowired注解自动装配的。
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_01/image-20210928153428691.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_01/image-20210928153428691.png" />
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -97,7 +97,7 @@ public interface BeanFactoryPostProcessor {
|
||||
}
|
||||
```
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_02/image-20210928171641029.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_02/image-20210928171641029.png"/>
|
||||
|
||||
核心就是我们对于传进来的参数,可以**修改,覆盖,添加**它的东西。对于BeanPostProcessor来说,传进来的参数是`(Object bean, String beanName)` ,它都已经把bean传给你了,这意味着我们可以修改传进来的Bean的任何东西。不管你是事务也好,AOP也好,都是通过这些个后置处理器来添加这些额外功能的。
|
||||
|
||||
@@ -106,11 +106,11 @@ BeanFactoryPostProcessor:后置增强BeanFactory,也就是增强Bean工厂
|
||||
|
||||
### BeanFactoryPostProcessor的接口关系
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_02/image-20210928172716846.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_02/image-20210928172716846.png" />
|
||||
|
||||
### BeanPostProcessor接口关系
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_02/image-20210928173012384.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_02/image-20210928173012384.png"/>
|
||||
|
||||
DestructionAwareBeanPostProcessor接口是跟销毁有关的,我们这里不分析
|
||||
|
||||
@@ -391,7 +391,7 @@ public class MainTest {
|
||||
|
||||
### 流程图-Bean生命周期与后置工厂处理器
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.7/spring-sourcecode-v1/flow_chart/Bean%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F%E4%B8%8E%E5%90%8E%E7%BD%AE%E5%B7%A5%E5%8E%82%E5%A4%84%E7%90%86%E5%99%A8.png">
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.7/spring-sourcecode-v1/flow_chart/Bean%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F%E4%B8%8E%E5%90%8E%E7%BD%AE%E5%B7%A5%E5%8E%82%E5%A4%84%E7%90%86%E5%99%A8.png">
|
||||
|
||||
### BeanDefinitionRegistryPostProcessor
|
||||
|
||||
@@ -399,7 +399,7 @@ public class MainTest {
|
||||
|
||||
##### Debug调用栈
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_02/image-20210928193241982.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_02/image-20210928193241982.png"/>
|
||||
|
||||
##### AbstractApplicationContext#refresh()
|
||||
|
||||
@@ -615,9 +615,9 @@ public class MainTest {
|
||||
|
||||
> Spring中所有组件的获取都是通过getBean(),容器中有就拿,没有就创建。
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_02/image-20210928203211130.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_02/image-20210928203211130.png" />
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_02/image-20210928195709384.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_02/image-20210928195709384.png" />
|
||||
|
||||
下面那个是Spring默认提供的后置处理器,我们后面再讲。
|
||||
|
||||
@@ -677,11 +677,11 @@ public interface Ordered {
|
||||
|
||||
##### Debug调用栈
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_02/image-20210928203957687.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_02/image-20210928203957687.png"/>
|
||||
|
||||
从PostProcessorRegistrationDelegate 142行开始走不同的调用,代码在上面有注释
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_02/image-20210928204229225.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_02/image-20210928204229225.png" />
|
||||
|
||||
##### PostProcessorRegistrationDelegate#invokeBeanDefinitionRegistryPostProcessors()
|
||||
|
||||
@@ -706,7 +706,7 @@ private static void invokeBeanDefinitionRegistryPostProcessors(
|
||||
|
||||
##### Debug调用栈
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_02/image-20210928204806052.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_02/image-20210928204806052.png" />
|
||||
|
||||
|
||||
|
||||
@@ -733,7 +733,7 @@ private static void invokeBeanFactoryPostProcessors(
|
||||
|
||||
##### Debug调用栈
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_02/image-20210928210240702.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_02/image-20210928210240702.png" />
|
||||
|
||||
|
||||
|
||||
@@ -741,7 +741,7 @@ private static void invokeBeanFactoryPostProcessors(
|
||||
|
||||
##### Debug调用栈
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_02/image-20210928210858103.png">
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_02/image-20210928210858103.png">
|
||||
|
||||
代码注释也是上面那个,BeanDefinitionRegistryPostProcessor和BeanFactoryPostProcessor执行逻辑基本一样
|
||||
|
||||
@@ -779,11 +779,11 @@ public class MainConfig {
|
||||
|
||||
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_02/image-20210928211847405.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_02/image-20210928211847405.png" />
|
||||
|
||||
从这一步进来
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_02/image-20210928212026255.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_02/image-20210928212026255.png" />
|
||||
|
||||
|
||||
|
||||
@@ -791,7 +791,7 @@ public class MainConfig {
|
||||
|
||||
#### PostProcessorRegistrationDelegate#invokeBeanDefinitionRegistryPostProcessors()
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_02/image-20210928212134359.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_02/image-20210928212134359.png" />
|
||||
|
||||
F7进入
|
||||
|
||||
@@ -799,7 +799,7 @@ F7进入
|
||||
|
||||
ConfigurationClassPostProcessor配置类的后置处理
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_02/image-20210928212332382.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_02/image-20210928212332382.png" />
|
||||
|
||||
|
||||
|
||||
@@ -914,7 +914,7 @@ ConfigurationClassPostProcessor配置类的后置处理
|
||||
|
||||
这几个怎么来的我们后面说
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_02/image-20210928212543963.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_02/image-20210928212543963.png" />
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -250,7 +250,7 @@ public class MainTest {
|
||||
|
||||
### 流程图-Bean生命周期与后置处理器
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.7/spring-sourcecode-v1/flow_chart/Bean%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F%E4%B8%8E%E5%90%8E%E7%BD%AE%E5%A4%84%E7%90%86%E5%99%A8.png">
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.7/spring-sourcecode-v1/flow_chart/Bean%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F%E4%B8%8E%E5%90%8E%E7%BD%AE%E5%A4%84%E7%90%86%E5%99%A8.png">
|
||||
|
||||
### BeanPostProcessor-执行无参构造
|
||||
|
||||
@@ -258,7 +258,7 @@ public class MainTest {
|
||||
|
||||
#### Debug调用栈
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_03/image-20210929142257774.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_03/image-20210929142257774.png"/>
|
||||
|
||||
#### AbstractApplicationContext#registerBeanPostProcessors()注册Bean后置处理器
|
||||
|
||||
@@ -345,7 +345,7 @@ protected void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFa
|
||||
- Bean工厂后置处理器调用的是`invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory , List<BeanFactoryPostProcessor> )`
|
||||
- Bean后置处理器调用的是`registerBeanPostProcessors(ConfigurableListableBeanFactory , AbstractApplicationContext )`
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_03/image-20210929144115434.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_03/image-20210929144115434.png"/>
|
||||
|
||||
|
||||
|
||||
@@ -355,7 +355,7 @@ protected void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFa
|
||||
> 2. BeanFactoryPostProcessor是先执行完每一个的无参构造和实现的几个方法,再去执行下一个BeanFactoryPostProcessor
|
||||
> 3. BeanPostProcessor是先执行所有BeanPostProcessor的无参构造,再执行所有BeanPostProcessor实现的方法。
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_03/image-20210929145612361.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_03/image-20210929145612361.png"/>
|
||||
|
||||
### MergedBeanDefinitionPostProcessor-执行无参构造
|
||||
|
||||
@@ -365,7 +365,7 @@ protected void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFa
|
||||
|
||||
同上
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_03/image-20210929150155334.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_03/image-20210929150155334.png"/>
|
||||
|
||||
|
||||
|
||||
@@ -375,7 +375,7 @@ protected void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFa
|
||||
|
||||
#### Debug调用栈
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_03/image-20210929160714133.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_03/image-20210929160714133.png"/>
|
||||
|
||||
|
||||
|
||||
@@ -542,7 +542,7 @@ protected void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFa
|
||||
3. 判断是不是想要的类型。
|
||||
3. 这里有没有优化空间,再存一个BeanType=>BeanName的对应关系?但是这样的关系是一对多的,同一个BeanType下可能有多个beanName,Spring可能是考虑到空间成本,没有这样弄。
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_03/image-20210929163852056.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_03/image-20210929163852056.png"/>
|
||||
|
||||
|
||||
|
||||
@@ -554,7 +554,7 @@ protected void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFa
|
||||
|
||||
2. 我们来看看此时单例池里有哪些对象
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_03/image-20210929170557025.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_03/image-20210929170557025.png" />
|
||||
|
||||
```java
|
||||
protected boolean isTypeMatch(String name, ResolvableType typeToMatch, boolean allowFactoryBeanInit)
|
||||
@@ -687,13 +687,13 @@ protected void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFa
|
||||
|
||||
在此方法里为什么Cat会进来两次呢?往后面看
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_03/image-20210929172115093.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_03/image-20210929172115093.png" />
|
||||
|
||||
### InstantiationAwareBeanPostProcessor-执行postProcessBeforeInstantiation方法
|
||||
|
||||
#### Debug调用栈
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_03/image-20210929172554306.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_03/image-20210929172554306.png"/>
|
||||
|
||||
#### AbstractApplicationContext#finishBeanFactoryInitialization()完成BeanFactory初始化
|
||||
|
||||
@@ -746,7 +746,7 @@ protected void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFa
|
||||
|
||||
2. 上面我们也看了只有Cat的对象还没创建,还没初始化,所以下面就开始创建对象了。
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_03/image-20210929173103459.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_03/image-20210929173103459.png" />
|
||||
|
||||
|
||||
|
||||
@@ -860,7 +860,7 @@ protected void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFa
|
||||
|
||||
#### Debug调用栈
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_03/image-20210929174424136.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_03/image-20210929174424136.png"/>
|
||||
|
||||
> 前面还是一样的执行逻辑,直接来到下面
|
||||
|
||||
@@ -1003,7 +1003,7 @@ protected void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFa
|
||||
|
||||
1. 实例提供者:
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_03/image-20210929175511913.png" >
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_03/image-20210929175511913.png" >
|
||||
|
||||
|
||||
|
||||
@@ -1025,7 +1025,7 @@ protected void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFa
|
||||
|
||||
### Cat-执行无参构造方法
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_03/image-20210930110158555.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_03/image-20210930110158555.png" />
|
||||
|
||||
|
||||
|
||||
@@ -1039,7 +1039,7 @@ protected void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFa
|
||||
|
||||
#### Debug调用栈
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_03/image-20210930110913527.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_03/image-20210930110913527.png" />
|
||||
|
||||
|
||||
|
||||
@@ -1061,7 +1061,7 @@ protected void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFa
|
||||
|
||||
#### Debug调用栈
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_03/image-20210930112247246.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_03/image-20210930112247246.png"/>
|
||||
|
||||
#### AbstractAutowireCapableBeanFactory#populateBean()属性赋值
|
||||
|
||||
@@ -1141,7 +1141,7 @@ protected void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFa
|
||||
}
|
||||
```
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_03/image-20210930112621989.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_03/image-20210930112621989.png"/>
|
||||
|
||||
|
||||
|
||||
@@ -1193,7 +1193,7 @@ public void setValue(@Nullable Object value) throws Exception { //name setName
|
||||
|
||||
#### Debug调用栈
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_03/image-20210930113459713.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_03/image-20210930113459713.png"/>
|
||||
|
||||
|
||||
|
||||
@@ -1201,7 +1201,7 @@ public void setValue(@Nullable Object value) throws Exception { //name setName
|
||||
|
||||
#### AutowiredAnnotationBeanPostProcessor#postProcessProperties()
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_03/image-20210930114234547.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_03/image-20210930114234547.png" />
|
||||
|
||||
```java
|
||||
public PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName) {
|
||||
@@ -1322,7 +1322,7 @@ public PropertyValues postProcessProperties(PropertyValues pvs, Object bean, Str
|
||||
|
||||
#### Debug调用栈
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_03/image-20210930114612277.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_03/image-20210930114612277.png"/>
|
||||
|
||||
这也说明了,@Autowire,@Value赋值的时候会去找setXXX,这也是@Autowire的原理
|
||||
|
||||
@@ -1350,7 +1350,7 @@ public PropertyValues postProcessProperties(PropertyValues pvs, Object bean, Str
|
||||
|
||||
#### Debug调用栈
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_03/image-20210930143504497.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_03/image-20210930143504497.png"/>
|
||||
|
||||
|
||||
|
||||
@@ -1461,7 +1461,7 @@ public Object postProcessBeforeInitialization(Object bean, String beanName) thro
|
||||
|
||||
#### Debug调用栈
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_03/image-20210930150311019.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_03/image-20210930150311019.png"/>
|
||||
|
||||
|
||||
|
||||
@@ -1513,7 +1513,7 @@ public Object postProcessBeforeInitialization(Object bean, String beanName) thro
|
||||
|
||||
#### Debug调用栈
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_03/image-20210930150604716.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_03/image-20210930150604716.png"/>
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -16,7 +16,7 @@ date: 2022-01-27 21:01:02
|
||||
|
||||
## 流程图-bean初始化流程
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.7/spring-sourcecode-v1/flow_chart/bean%E5%88%9D%E5%A7%8B%E5%8C%96%E6%B5%81%E7%A8%8B.jpg">
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.7/spring-sourcecode-v1/flow_chart/bean%E5%88%9D%E5%A7%8B%E5%8C%96%E6%B5%81%E7%A8%8B.jpg">
|
||||
|
||||
## AbstractApplicationContext#refresh()
|
||||
|
||||
@@ -206,7 +206,7 @@ date: 2022-01-27 21:01:02
|
||||
|
||||
## 工厂Bean的初始化方式
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_04/image-20210930171319531.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_04/image-20210930171319531.png"/>
|
||||
|
||||
|
||||
|
||||
@@ -313,13 +313,13 @@ public class Hello {
|
||||
|
||||
从这里开始看调用链
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_04/image-20210930175345542.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_04/image-20210930175345542.png"/>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_04/image-20210930175539928.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_04/image-20210930175539928.png"/>
|
||||
|
||||
|
||||
|
||||
@@ -475,13 +475,13 @@ String FACTORY_BEAN_PREFIX = "&";
|
||||
|
||||
最后返回
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_04/image-20210930180811270.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_04/image-20210930180811270.png"/>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_04/image-20210930181219048.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_04/image-20210930181219048.png"/>
|
||||
|
||||
|
||||
|
||||
@@ -532,7 +532,7 @@ public class Cat implements InitializingBean, SmartInitializingSingleton {
|
||||
|
||||
### Debug调用栈
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_04/image-20211008174534713.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_04/image-20211008174534713.png"/>
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -18,7 +18,7 @@ date: 2022-02-13 18:01:02
|
||||
|
||||
## 流程图-容器刷新
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.7/spring-sourcecode-v1/flow_chart/%E5%AE%B9%E5%99%A8%E5%88%B7%E6%96%B0%E6%B5%81%E7%A8%8B.jpg">
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.7/spring-sourcecode-v1/flow_chart/%E5%AE%B9%E5%99%A8%E5%88%B7%E6%96%B0%E6%B5%81%E7%A8%8B.jpg">
|
||||
|
||||
## 容器创建
|
||||
|
||||
@@ -209,7 +209,7 @@ public class AnnotationMainTest {
|
||||
|
||||
上面的方法走完,我们可以看看到主要是下面4个后置处理器
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_05/image-20211008212541000.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_05/image-20211008212541000.png"/>
|
||||
|
||||
##### RootBeanDefinition
|
||||
|
||||
@@ -360,7 +360,7 @@ public class AnnotationMainTest {
|
||||
|
||||
走完之后,注册中心肯定多了咱们的配置类
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_05/image-20211008213900796.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_05/image-20211008213900796.png"/>
|
||||
|
||||
|
||||
|
||||
@@ -584,7 +584,7 @@ protected void initPropertySources() {
|
||||
}
|
||||
```
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_05/image-20211009105903816.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_05/image-20211009105903816.png"/>
|
||||
|
||||
|
||||
|
||||
@@ -607,11 +607,11 @@ protected void initPropertySources() {
|
||||
|
||||
这一步有个很关键的后置处理器
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_05/image-20211009113419863.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_05/image-20211009113419863.png"/>
|
||||
|
||||
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_05/image-20211009114151034.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_05/image-20211009114151034.png"/>
|
||||
|
||||
|
||||
|
||||
@@ -746,7 +746,7 @@ protected void initPropertySources() {
|
||||
|
||||
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_05/image-20211009115044348.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_05/image-20211009115044348.png"/>
|
||||
|
||||
|
||||
|
||||
@@ -1043,7 +1043,7 @@ public class ClassPathBeanDefinitionScanner extends ClassPathScanningCandidateCo
|
||||
|
||||
拿到所有类(资源),不管你有没有标@Component注解。然后挨个遍历每一个资源是不是候选的组件(根据前面准备的一些条件,在这里进行判断)
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_05/image-20211009145119146.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_05/image-20211009145119146.png"/>
|
||||
|
||||
|
||||
|
||||
@@ -1051,7 +1051,7 @@ public class ClassPathBeanDefinitionScanner extends ClassPathScanningCandidateCo
|
||||
|
||||
最后我们看一下执行完之后的BeanDefinition信息
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_05/image-20211009150338205.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_05/image-20211009150338205.png"/>
|
||||
|
||||
|
||||
|
||||
@@ -1309,7 +1309,7 @@ public class B {
|
||||
|
||||
这就是循环引用的场景,这种写法由于Spring内部获取Bean都是通过getBean方法来获取,就造成了下面的死循环。我们来看看Spring是怎么解决的。
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_05/image-20210928203211130.png">
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_05/image-20210928203211130.png">
|
||||
|
||||
|
||||
|
||||
@@ -1568,16 +1568,16 @@ public class B {
|
||||
|
||||
1. pos_1位置先进入pos_3位置的`getSingleton(beanName, true)`,查看缓存中有没有A组件
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_05/image-20211009165057518.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_05/image-20211009165057518.png"/>
|
||||
|
||||
2. 然后走到pos_2调用pos_5的`getSingleton()`开始创建A的流程
|
||||
3. 在pos_5的`getSingleton()`中走到pos_6的`beforeSingletonCreation()`,就变成下面这样
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_05/image-20211009165924811.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_05/image-20211009165924811.png"/>
|
||||
|
||||
4. 接着pos_7的会调用pos_2的lamda表达式里的`createbean()`,里面再调用`doCreateBean()`。前面讲过不多说,最终调用A的无参构造(pos_8),创建完之后发现A的B属性是null。
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_05/image-20211009170632290.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_05/image-20211009170632290.png"/>
|
||||
|
||||
5.在pos_9处的`addSingletonFactory()`来准备解决循环引用
|
||||
|
||||
@@ -1594,7 +1594,7 @@ public class B {
|
||||
}
|
||||
```
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_05/image-20211009171641665.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_05/image-20211009171641665.png"/>
|
||||
|
||||
|
||||
|
||||
@@ -1662,11 +1662,11 @@ public class B {
|
||||
|
||||
通过前面讲过的AutowiredAnnotationBeanPostProcessor来注入B,最后发现要调用setB方法给B赋值
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_05/image-20211009172602037.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_05/image-20211009172602037.png"/>
|
||||
|
||||
7. 继续走,发现要想获得B还是要调用getBean
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_05/image-20211009172943987.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_05/image-20211009172943987.png" />
|
||||
|
||||
```java
|
||||
public Object resolveCandidate(String beanName, Class<?> requiredType, BeanFactory beanFactory)
|
||||
@@ -1680,13 +1680,13 @@ public class B {
|
||||
|
||||
然后图就是这样子
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_05/image-20211009173310844.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_05/image-20211009173310844.png"/>
|
||||
|
||||
|
||||
|
||||
8. B也是走这一套
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_05/image-20211009175223998.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_05/image-20211009175223998.png"/>
|
||||
|
||||
9. B为了获取A,还要再走一次getBean()流程,最终还是走到
|
||||
|
||||
@@ -1720,13 +1720,13 @@ public class B {
|
||||
}
|
||||
```
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_05/image-20211009175603012.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_05/image-20211009175603012.png"/>
|
||||
|
||||
|
||||
|
||||
10.
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_05/image-20211009175756620.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_05/image-20211009175756620.png"/>
|
||||
|
||||
|
||||
|
||||
@@ -1739,7 +1739,7 @@ public class B {
|
||||
|
||||
12. B初始化完之后,回到getSingleton,把自己放到单例池里
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_05/image-20211009180127487.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_05/image-20211009180127487.png"/>
|
||||
|
||||
```java
|
||||
protected void addSingleton(String beanName, Object singletonObject) {
|
||||
@@ -1752,15 +1752,15 @@ protected void addSingleton(String beanName, Object singletonObject) {
|
||||
}
|
||||
```
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_05/image-20211009180214917.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_05/image-20211009180214917.png"/>
|
||||
|
||||
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_05/image-20211009180410898.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_05/image-20211009180410898.png"/>
|
||||
|
||||
13. B全部结束之后回到A的流程,A赋值工作结束了,然后就开始A的初始化。初始化的过程中
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_05/image-20211009180807630.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_05/image-20211009180807630.png"/>
|
||||
|
||||
```java
|
||||
protected void addSingleton(String beanName, Object singletonObject) {
|
||||
@@ -1775,7 +1775,7 @@ protected void addSingleton(String beanName, Object singletonObject) {
|
||||
|
||||
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_05/image-20211009180545206.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_05/image-20211009180545206.png"/>
|
||||
|
||||
|
||||
|
||||
@@ -1787,7 +1787,7 @@ protected void addSingleton(String beanName, Object singletonObject) {
|
||||
|
||||
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_05/循环引用.jpg">
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_05/循环引用.jpg">
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -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" />
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -20,7 +20,7 @@ date: 2022-04-17 12:01:02
|
||||
|
||||
## 流程图-AOP运行流程原理
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.7/spring-sourcecode-v1/flow_chart/AOP%E8%BF%90%E8%A1%8C%E6%B5%81%E7%A8%8B%E5%8E%9F%E7%90%86.jpg">
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.7/spring-sourcecode-v1/flow_chart/AOP%E8%BF%90%E8%A1%8C%E6%B5%81%E7%A8%8B%E5%8E%9F%E7%90%86.jpg">
|
||||
|
||||
## 由Aop的执行流程引出方法拦截器
|
||||
|
||||
@@ -28,11 +28,11 @@ date: 2022-04-17 12:01:02
|
||||
|
||||
断点打到这里,F7进入方法
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_07/image-20211012195045643.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_07/image-20211012195045643.png"/>
|
||||
|
||||
自然而然的跳到了cglib这里
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_07/image-20211012195313364.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_07/image-20211012195313364.png" />
|
||||
|
||||
#### CglibAopProxy#intercept()
|
||||
|
||||
@@ -80,7 +80,7 @@ date: 2022-04-17 12:01:02
|
||||
|
||||
#### CglibAopProxy#getInterceptorsAndDynamicInterceptionAdvice()
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_07/image-20211012195459849.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_07/image-20211012195459849.png" />
|
||||
|
||||
1. 把5个增强器变成了方法拦截器,增强器只是保存信息的,真正执行还得靠方法拦截器。
|
||||
2. 我们再给上面的470行打上断点,看下之前是如何生成方法拦截器的。因为第一次生成的时候没有缓存,肯定能进去470行。
|
||||
@@ -91,9 +91,9 @@ date: 2022-04-17 12:01:02
|
||||
|
||||
#### Debug调用栈
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_07/image-20211012201950845.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_07/image-20211012201950845.png" />
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_07/image-20211012202049726.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_07/image-20211012202049726.png" />
|
||||
|
||||
可以看到就是在之前创建代理对象的时候增强器转成的拦截器
|
||||
|
||||
@@ -240,7 +240,7 @@ public class MethodBeforeAdviceInterceptor implements MethodInterceptor, BeforeA
|
||||
|
||||
然后debug回到accept()方法
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_07/image-20211012202236451.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_07/image-20211012202236451.png" />
|
||||
|
||||
|
||||
|
||||
@@ -248,12 +248,12 @@ public class MethodBeforeAdviceInterceptor implements MethodInterceptor, BeforeA
|
||||
|
||||
## 正式开始分析AOP运行流程-链式执行
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_07/image-20211012220057607.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_07/image-20211012220057607.png"/>
|
||||
|
||||
1. F7进入方法,上面讲过会调用CglibAopProxy内部类的DynamicAdvisedInterceptor#intercept()。这次我们来说下为什么会跳到DynamicAdvisedInterceptor#intercept()方法
|
||||
2. HelloService是一个代理对象,它的AOP代理是一个DynamicAdvisedInterceptor对象
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_07/image-20211012220839278.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_07/image-20211012220839278.png"/>
|
||||
|
||||
3. 而DynamicAdvisedInterceptor实现了MethodInterceptor接口
|
||||
|
||||
@@ -347,27 +347,27 @@ public interface MethodInterceptor extends Interceptor {
|
||||
}
|
||||
```
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_07/image-20211012223909994.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_07/image-20211012223909994.png" />
|
||||
|
||||
在前面创建HelloService代理对象时创建好的方法拦截器,然后调用proceed()
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_07/image-20211012224227624.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_07/image-20211012224227624.png" />
|
||||
|
||||
### CglibMethodInvocation#proceed()
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_07/image-20211012224431389.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_07/image-20211012224431389.png" />
|
||||
|
||||
|
||||
|
||||
顾名思义,就是用来执行Cglib生成的代理对象的方法
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_07/image-20211012224629196.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_07/image-20211012224629196.png"/>
|
||||
|
||||
|
||||
|
||||
#### CglibAopProxy#proceed()
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_07/image-20211012231748956.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_07/image-20211012231748956.png" />
|
||||
|
||||
```java
|
||||
public Object proceed() throws Throwable {
|
||||
@@ -429,7 +429,7 @@ public interface MethodInterceptor extends Interceptor {
|
||||
}
|
||||
```
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_07/image-20211012225055742.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_07/image-20211012225055742.png"/>
|
||||
|
||||
上面5个拦截器都继承了Spring的org.aopalliance.intercept.MethodInterceptor,和Cglib的MethodInterceptor没关系了
|
||||
|
||||
@@ -437,19 +437,19 @@ public interface MethodInterceptor extends Interceptor {
|
||||
|
||||
获取第一个拦截器ExposeInvocationInterceptor
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_07/image-20211012225804099.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_07/image-20211012225804099.png"/>
|
||||
|
||||
往下走,直接走到了这里,准备调用ExposeInvocationInterceptor的invoke()
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_07/image-20211012230419970.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_07/image-20211012230419970.png" />
|
||||
|
||||
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_07/image-20211012230646766.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_07/image-20211012230646766.png"/>
|
||||
|
||||
##### CglibAopProxy#proceed()
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_07/image-20211012230842658.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_07/image-20211012230842658.png" />
|
||||
|
||||
```java
|
||||
public Object proceed() throws Throwable {
|
||||
@@ -481,35 +481,35 @@ public Object proceed() throws Throwable {
|
||||
|
||||
结果又调回了,很明显这是个递归调用
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_07/image-20211012230930440.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_07/image-20211012230930440.png" />
|
||||
|
||||
#### MethodBeforeAdviceInterceptor-前置通知
|
||||
|
||||
然后后面的调用逻辑和前面就一样了,如下
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_07/image-20211012231135459.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_07/image-20211012231135459.png" />
|
||||
|
||||
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_07/image-20211012231202337.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_07/image-20211012231202337.png" />
|
||||
|
||||
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_07/image-20211012231327882.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_07/image-20211012231327882.png"/>
|
||||
|
||||
这个时候就先执行切面的before方法,前置通知就执行了
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_07/image-20211012232119227.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_07/image-20211012232119227.png" />
|
||||
|
||||
继续调父类的方法
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_07/image-20211012231412866.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_07/image-20211012231412866.png"/>
|
||||
|
||||
|
||||
|
||||
#### AspectJAfterAdvice-后置通知
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_07/image-20211012232315412.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_07/image-20211012232315412.png" />
|
||||
|
||||
后置通知这里先不执行,先继续执行下面的方法拦截器链路,最后finally再执行后置通知
|
||||
|
||||
@@ -517,7 +517,7 @@ public Object proceed() throws Throwable {
|
||||
|
||||
#### AfterReturningAdviceInterceptor-返回通知
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_07/image-20211012232551952.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_07/image-20211012232551952.png" />
|
||||
|
||||
1. 先往下走,我们就继续
|
||||
|
||||
@@ -527,7 +527,7 @@ public Object proceed() throws Throwable {
|
||||
|
||||
#### AspectJAfterThrowingAdvice-异常通知
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_07/image-20211012232910377.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_07/image-20211012232910377.png"/>
|
||||
|
||||
继续往下发现索引要超了
|
||||
|
||||
@@ -535,17 +535,17 @@ public Object proceed() throws Throwable {
|
||||
|
||||
#### 真正执行sayhello()
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_07/image-20211012233113154.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_07/image-20211012233113154.png"/>
|
||||
|
||||
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_07/image-20211012233212466.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_07/image-20211012233212466.png" />
|
||||
|
||||
|
||||
|
||||
放行之后看控制台,sayhello方法就打印了。并且到目前为止,只有前面说的前置通知执行了。
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_07/image-20211012233317479.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_07/image-20211012233317479.png" />
|
||||
|
||||
然后咱们就往后返,
|
||||
|
||||
@@ -553,7 +553,7 @@ public Object proceed() throws Throwable {
|
||||
|
||||
#### AspectJAfterThrowingAdvice-异常通知
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_07/image-20211012233506053.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_07/image-20211012233506053.png" />
|
||||
|
||||
咱们这里没异常,就继续返回了
|
||||
|
||||
@@ -561,13 +561,13 @@ public Object proceed() throws Throwable {
|
||||
|
||||
返回到这里,准备执行返回通知
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_07/image-20211012233633239.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_07/image-20211012233633239.png" />
|
||||
|
||||
|
||||
|
||||
放行之后的控制台
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_07/image-20211012233731212.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_07/image-20211012233731212.png" />
|
||||
|
||||
继续返回
|
||||
|
||||
@@ -575,11 +575,11 @@ public Object proceed() throws Throwable {
|
||||
|
||||
准备执行后置通知
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_07/image-20211012233837744.png">
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_07/image-20211012233837744.png">
|
||||
|
||||
放行finally之后的控制台
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_07/image-20211012233944290.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_07/image-20211012233944290.png" />
|
||||
|
||||
|
||||
|
||||
@@ -591,13 +591,13 @@ public Object proceed() throws Throwable {
|
||||
|
||||
继续返回
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_07/image-20211012234108557.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_07/image-20211012234108557.png" />
|
||||
|
||||
|
||||
|
||||
#### CglibAopProxy$DynamicAdvisedInterceptor
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_07/image-20211012234214735.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_07/image-20211012234214735.png" />
|
||||
|
||||
|
||||
|
||||
@@ -760,7 +760,7 @@ public class AnnotationMainTest {
|
||||
|
||||
在还未进行refresh()十二大步刷新时,容器就已经有了这两事件相关的Bean定义信息了。
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_07/image-20211013162535782.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_07/image-20211013162535782.png"/>
|
||||
|
||||
|
||||
|
||||
@@ -768,7 +768,7 @@ public class AnnotationMainTest {
|
||||
|
||||
#### 继承树
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_07/image-20211013162805867.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_07/image-20211013162805867.png" />
|
||||
|
||||
1. 我们看到实现了SmartInitializingSingleton和BeanFactoryPostProcessor
|
||||
2. BeanFactoryPostProcessor我们反复在说,就是工厂后置处理环节。EventListenerMethodProcessor实现了BeanFactoryPostProcessor,说明他在工厂后置处理环节会做事
|
||||
@@ -776,7 +776,7 @@ public class AnnotationMainTest {
|
||||
|
||||
> AbstractApplicationContext#refresh() ==> AbstractApplicationContext#finishBeanFactoryInitialization() ==> DefaultListableBeanFactory#preInstantiateSingletons()
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_07/image-20211013164017769.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_07/image-20211013164017769.png" />
|
||||
|
||||
|
||||
|
||||
@@ -786,7 +786,7 @@ public class AnnotationMainTest {
|
||||
|
||||
Debug启动
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_07/image-20211013170249700.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_07/image-20211013170249700.png"/>
|
||||
|
||||
果然是从工厂后置处理那里过来的
|
||||
|
||||
@@ -794,7 +794,7 @@ Debug启动
|
||||
|
||||
放行,继续往下走。果然SmartInitializingSingleton这里开始做事了
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_07/image-20211013170435169.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_07/image-20211013170435169.png" />
|
||||
|
||||
|
||||
|
||||
@@ -850,7 +850,7 @@ Debug启动
|
||||
|
||||
我们在这里打上条件断点
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_07/image-20211013170852409.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_07/image-20211013170852409.png"/>
|
||||
|
||||
|
||||
|
||||
@@ -858,15 +858,15 @@ Debug启动
|
||||
|
||||
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_07/image-20211013171247356.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_07/image-20211013171247356.png" />
|
||||
|
||||
F7进入下面的方法
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_07/image-20211013171641031.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_07/image-20211013171641031.png" />
|
||||
|
||||
咱们发现是创建了一个适配器
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_07/image-20211013171728867.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_07/image-20211013171728867.png" />
|
||||
|
||||
```java
|
||||
public ApplicationListenerMethodAdapter(String beanName, Class<?> targetClass, Method method) {
|
||||
@@ -885,17 +885,17 @@ public ApplicationListenerMethodAdapter(String beanName, Class<?> targetClass, M
|
||||
|
||||
为啥要创建这样一个适配器呢?虽然我们的AppEventListener不是监听器,它只是在方法里标注了监听注解,我们自己没有写监听器。但是咱们解析@EventListener注解之后,在这里生成的适配器却实现了EventListener,也就说明这个适配器就是个监听器。
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_07/image-20211013171936784.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_07/image-20211013171936784.png" />
|
||||
|
||||
|
||||
|
||||
继续往下放行
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_07/image-20211013172130892.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_07/image-20211013172130892.png" />
|
||||
|
||||
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_07/image-20211013172239216.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_07/image-20211013172239216.png" />
|
||||
|
||||
把适配器放到了事件多播器里
|
||||
|
||||
@@ -907,7 +907,7 @@ public ApplicationListenerMethodAdapter(String beanName, Class<?> targetClass, M
|
||||
|
||||
最后就是三个方法,三个适配器
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_07/image-20211013172925798.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_07/image-20211013172925798.png" />
|
||||
|
||||
|
||||
|
||||
@@ -915,11 +915,11 @@ public ApplicationListenerMethodAdapter(String beanName, Class<?> targetClass, M
|
||||
|
||||
给下面的位置打上断点
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_07/image-20211013173037562.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_07/image-20211013173037562.png" />
|
||||
|
||||
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_07/image-20211013173146059.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_07/image-20211013173146059.png" />
|
||||
|
||||
##### AbstractApplicationContext#publishEvent()
|
||||
|
||||
|
||||
@@ -92,11 +92,11 @@ public class AppConfig {
|
||||
|
||||
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_08/image-20211013185625476.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_08/image-20211013185625476.png" />
|
||||
|
||||
根路径是在这里配的,tomcat的配置自己百度下,很简单
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_08/image-20211013185659518.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_08/image-20211013185659518.png" />
|
||||
|
||||
## Java的SPI机制
|
||||
|
||||
@@ -321,7 +321,7 @@ cn.imlql.mysql.MySQLSaveService
|
||||
|
||||
### WebApplicationInitializer
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_08/image-20211013190116630.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_08/image-20211013190116630.png" />
|
||||
|
||||
|
||||
|
||||
@@ -342,13 +342,13 @@ public interface ServletContainerInitializer {
|
||||
|
||||
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_08/image-20211013190340419.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_08/image-20211013190340419.png"/>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_08/image-20211013192644360.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_08/image-20211013192644360.png"/>
|
||||
|
||||
|
||||
|
||||
@@ -469,15 +469,15 @@ ServiceLoader<DataSaveService> load = ServiceLoader.load(WebApplicationInitializ
|
||||
|
||||
下面就是所有实现了WebApplicationInitializer的类
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_08/image-20211013193308488.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_08/image-20211013193308488.png" />
|
||||
|
||||
接着在最底下的for循环执行所有实现了WebApplicationInitializer的类的onStartup(),然后就走到了我们的AppStarter
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_08/image-20211013194526880.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_08/image-20211013194526880.png" />
|
||||
|
||||
到这一步,ioc容器都没有创建,我们给refresh()打个断点,看什么时候启动的ioc
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_08/image-20211013194649936.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_08/image-20211013194649936.png" />
|
||||
|
||||
|
||||
|
||||
@@ -485,7 +485,7 @@ ServiceLoader<DataSaveService> load = ServiceLoader.load(WebApplicationInitializ
|
||||
|
||||
我看的时候debug断点没有看到从AppStarter的哪一步跳到refresh()的。然后我一步一步走的时候发现不是在这个方法里调用的,注意看下面的图,DispatcherServlet已经new完了,但是debug依然没有跳到refresh(),说明不是在new DispatcherServlet()的时候创建的容器
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_08/image-20211016204522610.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_08/image-20211016204522610.png" />
|
||||
|
||||
不过我凭经验猜测Springmvc里最重要的是DispatcherServlet,会不会是DispatcherServlet的那一步启动了IOC,我们开始进行下面的尝试
|
||||
|
||||
@@ -502,7 +502,7 @@ ServiceLoader<DataSaveService> load = ServiceLoader.load(WebApplicationInitializ
|
||||
3. 每次请求调用service处理
|
||||
4. tomcat停止的时候调用destroy进行销毁
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_08/image-20211013195139924.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_08/image-20211013195139924.png" />
|
||||
|
||||
4. Serlvet是被谁调用开始初始化的属于tomcat的源码,我们这里不研究,我们这里只需要知道,每一个Servlet都会被初始化就可以了。
|
||||
|
||||
@@ -512,7 +512,7 @@ spring-web中有一个叫DispatcherServlet的类,很明显他是一个Servlet
|
||||
|
||||
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_08/image-20211013195948793.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_08/image-20211013195948793.png" />
|
||||
|
||||
1. 想要启动IOC容器,只可能是创建DispatcherServlet对象或者调用init()的时候来搞。上面我们也看到了,创建DispatcherServlet对象的时候debug调用栈并没有显示跳到了refresh方法,所以显然不是创建对象的时候
|
||||
2. 那就只有可能是调用init()的时候开始启动的IOC容器
|
||||
@@ -652,13 +652,13 @@ DispatcherServlet没有重写initFrameworkServlet()
|
||||
|
||||
webloc.setParent(springloc)。类似于双亲委派,容器隔离。先看当前容器有没有这个组件,当前容器没有再去父容器找有没有这个组件
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_08/mvc-context-hierarchy.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_08/mvc-context-hierarchy.png"/>
|
||||
|
||||
### AbstractAnnotationConfigDispatcherServletInitializer能更快的整合Spring和SpringMVC
|
||||
|
||||
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_08/image-20211016213745753.png" />AbstractAnnotationConfigDispatcherServletInitializer能更快的整合Spring和SpringMVC
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_08/image-20211016213745753.png" />AbstractAnnotationConfigDispatcherServletInitializer能更快的整合Spring和SpringMVC
|
||||
|
||||
> 后面的讲解都用这个测试类
|
||||
|
||||
@@ -811,7 +811,7 @@ public interface ServletContextListener extends EventListener {
|
||||
|
||||
#### SpringServletContainerInitializer#onStartup()
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_08/image-20211017171353930.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_08/image-20211017171353930.png" />
|
||||
|
||||
|
||||
|
||||
@@ -858,7 +858,7 @@ public interface ServletContextListener extends EventListener {
|
||||
|
||||
#### AbstractDispatcherServletInitializer#onStartup()
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_08/image-20211017172450673.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_08/image-20211017172450673.png" />
|
||||
|
||||
因为咱们的QuickAppStarter没有onStarup()所以就调用了父类AbstractDispatcherServletInitializer的,没想到AbstractDispatcherServletInitializer也是继续调用父类的
|
||||
|
||||
@@ -875,7 +875,7 @@ public interface ServletContextListener extends EventListener {
|
||||
|
||||
#### AbstractContextLoaderInitializer#onStartup()
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_08/image-20211017172942469.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_08/image-20211017172942469.png" />
|
||||
|
||||
|
||||
|
||||
@@ -907,7 +907,7 @@ public abstract class AbstractContextLoaderInitializer implements WebApplication
|
||||
}
|
||||
```
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_08/image-20211016214957367.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_08/image-20211016214957367.png"/>
|
||||
|
||||
|
||||
|
||||
@@ -930,7 +930,7 @@ public abstract class AbstractContextLoaderInitializer implements WebApplication
|
||||
}
|
||||
```
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_08/image-20211017174011291.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_08/image-20211017174011291.png" />
|
||||
|
||||
getRootConfigClasses()正好是咱们QuickAppStarter这个子类重写的,debug F7进入
|
||||
|
||||
@@ -938,19 +938,19 @@ getRootConfigClasses()正好是咱们QuickAppStarter这个子类重写的,debu
|
||||
|
||||
果不其然,调用了QuickAppStarter#getRootConfigClasses()
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_08/image-20211017174118178.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_08/image-20211017174118178.png"/>
|
||||
|
||||
|
||||
|
||||
继续往下走创建Web容器,这是Spring父容器,因为你看它getRootConfigClasses()获取的是父容器配置
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_08/image-20211017174500213.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_08/image-20211017174500213.png"/>
|
||||
|
||||
|
||||
|
||||
然后返回
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_08/image-20211017174828598.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_08/image-20211017174828598.png" />
|
||||
|
||||
|
||||
|
||||
@@ -983,7 +983,7 @@ public class ContextLoaderListener extends ContextLoader implements ServletConte
|
||||
|
||||
接着就继续返回
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_08/image-20211017175108566.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_08/image-20211017175108566.png"/>
|
||||
|
||||
|
||||
|
||||
@@ -1022,7 +1022,7 @@ public class ContextLoaderListener extends ContextLoader implements ServletConte
|
||||
}
|
||||
```
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_08/image-20211017175449110.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_08/image-20211017175449110.png" />
|
||||
|
||||
|
||||
|
||||
@@ -1040,25 +1040,25 @@ public class ContextLoaderListener extends ContextLoader implements ServletConte
|
||||
}
|
||||
```
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_08/image-20211017175724861.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_08/image-20211017175724861.png"/>
|
||||
|
||||
这里又new了一个容器,和上面那个容器一样都没有初始化。这里也是调用咱们QuickAppStarter重写的方法,因为这里调用的是getServletConfigClasses(),所以很明显这里的容器是Web子容器
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_08/image-20211017180020098.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_08/image-20211017180020098.png" />
|
||||
|
||||
然后就一路往回返,走到这里
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_08/image-20211017180356531.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_08/image-20211017180356531.png"/>
|
||||
|
||||
继续F7进入
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_08/image-20211017180749457.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_08/image-20211017180749457.png" />
|
||||
|
||||
这里就是保存咱们上面刚创建的Web子容器,然后再返回
|
||||
|
||||
#### 返回到SpringServletContainerInitializer#onStartup()
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_08/image-20211017181428636.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_08/image-20211017181428636.png"/>
|
||||
|
||||
1. 这里应用就加载完了,接下来干嘛呢?
|
||||
2. 你往前看看,咱们的Spring容器和Web子容器都是只是创建完了,都还没有初始化,甚至都没有webloc.setParent(springloc)这样产生父子容器的关系
|
||||
@@ -1072,7 +1072,7 @@ public class ContextLoaderListener extends ContextLoader implements ServletConte
|
||||
|
||||
#### ContextLoaderListener#contextInitialized()
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_08/image-20211017182550786.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_08/image-20211017182550786.png" />
|
||||
|
||||
|
||||
|
||||
@@ -1080,23 +1080,23 @@ public class ContextLoaderListener extends ContextLoader implements ServletConte
|
||||
|
||||
然后真的走到了这里。tomcat里的代码位置是乱的,乱的意思就是比如说上面写的是4766行的调用,但实际上那里是个`}`大括号。也不知道是什么问题,所以我们就大致看下tomcat的代码,不细究。
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_08/image-20211017183133699.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_08/image-20211017183133699.png" />
|
||||
|
||||
这里的调用还是对的
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_08/image-20211017183255872.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_08/image-20211017183255872.png" />
|
||||
|
||||
|
||||
|
||||
应该就是类似这样的调用
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_08/image-20211017183351172.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_08/image-20211017183351172.png" />
|
||||
|
||||
|
||||
|
||||
走的应该是第一个if
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_08/image-20211017183536609.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_08/image-20211017183536609.png"/>
|
||||
|
||||
|
||||
|
||||
@@ -1104,21 +1104,21 @@ public class ContextLoaderListener extends ContextLoader implements ServletConte
|
||||
|
||||
#### ContextLoader#initWebApplicationContext()
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_08/image-20211017183828726.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_08/image-20211017183828726.png" />
|
||||
|
||||
|
||||
|
||||
F7进入,这里因为我重新启动了一次,所以你看到根容器是@3661
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_08/image-20211017184039846.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_08/image-20211017184039846.png" />
|
||||
|
||||
终于要调用refresh了
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_08/image-20211017184056048.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_08/image-20211017184056048.png" />
|
||||
|
||||
这里直接放行到容器refresh完毕看下父容器
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_08/image-20211017184405806.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_08/image-20211017184405806.png" />
|
||||
|
||||
父容器只扫描了,springconfig和helloService,我们继续放行看下Web子容器.
|
||||
|
||||
@@ -1130,7 +1130,7 @@ F7进入,这里因为我重新启动了一次,所以你看到根容器是@36
|
||||
|
||||
跳到了这里,为什么会跳到这里呢?记不记得之前我们用DispatcherServlet保存了Web子容器,这里就要调用DispatcherServlet的相关初始化方法
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_08/image-20211017185442060.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_08/image-20211017185442060.png"/>
|
||||
|
||||
|
||||
|
||||
@@ -1140,7 +1140,7 @@ F7进入,这里因为我重新启动了一次,所以你看到根容器是@36
|
||||
|
||||
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_08/image-20211017191309358.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_08/image-20211017191309358.png"/>
|
||||
|
||||
上面父子容器关系形成了,并且父容器已经refresh完毕
|
||||
|
||||
@@ -1202,11 +1202,11 @@ F7进入,这里因为我重新启动了一次,所以你看到根容器是@36
|
||||
|
||||
#### FrameworkServlet#createWebApplicationContext()
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_08/image-20211017191503347.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_08/image-20211017191503347.png" />
|
||||
|
||||
再次来到Web子容器的刷新
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_08/image-20211017191705766.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_08/image-20211017191705766.png" />
|
||||
|
||||
1. 然后我们看到子容器只有它自己的东西
|
||||
2. 虽然子容器只有controller,但是因为它保存了父容器。所以它是可以拿到HelloService的,也就是我们可以在HelloController里装配HelloService
|
||||
|
||||
@@ -16,7 +16,7 @@ date: 2022-06-21 12:01:02
|
||||
|
||||
## 请求的处理链路
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_09/image-20211017194744212.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_09/image-20211017194744212.png"/>
|
||||
|
||||
1. tomcat里面可以部署多个项目应用。/abc_test和mvc_test这种就是项目路径,用于区分多个项目
|
||||
2. 在以前的Servlet开发中,每一个路径都需要有一个Servlet来处理。比如上图所画
|
||||
@@ -26,7 +26,7 @@ date: 2022-06-21 12:01:02
|
||||
|
||||
### Servlet继承树
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_09/image-20211017195927505.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_09/image-20211017195927505.png"/>
|
||||
|
||||
|
||||
|
||||
@@ -41,7 +41,7 @@ date: 2022-06-21 12:01:02
|
||||
|
||||
### Debug调用栈
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_09/image-20211017205544154.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_09/image-20211017205544154.png" />
|
||||
|
||||
### DispatcherServlet#doService()
|
||||
|
||||
@@ -191,7 +191,7 @@ date: 2022-06-21 12:01:02
|
||||
|
||||
### doDispatch处理大流程图
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_09/doDispatch处理大流程.jpg">
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_09/doDispatch处理大流程.jpg">
|
||||
|
||||
|
||||
|
||||
@@ -210,7 +210,7 @@ protected HttpServletRequest checkMultipart(HttpServletRequest request) throws M
|
||||
}
|
||||
```
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_09/image-20211017205843256.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_09/image-20211017205843256.png" />
|
||||
|
||||
咱们这里目前连解析器都没有,所以就直接返回了
|
||||
|
||||
@@ -268,7 +268,7 @@ public boolean isMultipart(HttpServletRequest request) {
|
||||
|
||||
[官网介绍](https://docs.spring.io/spring-framework/docs/current/reference/html/web.html#mvc-servlet-special-bean-types)
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_09/image-20211017210137817.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_09/image-20211017210137817.png" />
|
||||
|
||||
|
||||
|
||||
@@ -328,7 +328,7 @@ public boolean isMultipart(HttpServletRequest request) {
|
||||
|
||||
### Debug调用栈
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_09/image-20211018162558076.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_09/image-20211018162558076.png" />
|
||||
|
||||
|
||||
|
||||
@@ -381,7 +381,7 @@ public boolean isMultipart(HttpServletRequest request) {
|
||||
|
||||
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_09/image-20211018164740715.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_09/image-20211018164740715.png" />
|
||||
|
||||
|
||||
|
||||
@@ -491,7 +491,7 @@ org.springframework.web.servlet.FlashMapManager=org.springframework.web.servlet.
|
||||
|
||||
### DispatcherServlet#getHandler()根据请求拿Controller
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_09/image-20211018165759982.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_09/image-20211018165759982.png" />
|
||||
|
||||
|
||||
|
||||
@@ -506,13 +506,13 @@ org.springframework.web.servlet.FlashMapManager=org.springframework.web.servlet.
|
||||
|
||||
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_09/image-20211018170430551.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_09/image-20211018170430551.png"/>
|
||||
|
||||
BeanNameUrlHandlerMapping里找不到映射关系,就直接下一个循环了。咱们主要看RequestMappingHandlerMapping怎么处理的
|
||||
|
||||
## RequestMappingHandlerMapping处理流程
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_09/image-20211018170624402.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_09/image-20211018170624402.png" />
|
||||
|
||||
|
||||
|
||||
@@ -569,7 +569,7 @@ F7进入`mapping.getHandler(request)`
|
||||
}
|
||||
```
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_09/image-20211018172011789.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_09/image-20211018172011789.png" />
|
||||
|
||||
F7进入`getHandlerInternal(request)`
|
||||
|
||||
@@ -609,7 +609,7 @@ F7进入`getHandlerInternal(request)`
|
||||
|
||||
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_09/image-20211018172342398.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_09/image-20211018172342398.png" />
|
||||
|
||||
F7进入`lookupHandlerMethod(lookupPath, request)`
|
||||
|
||||
@@ -617,7 +617,7 @@ F7进入`lookupHandlerMethod(lookupPath, request)`
|
||||
|
||||
### AbstractHandlerMethodMapping#lookupHandlerMethod()真正根据URL查Controller
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_09/image-20211018173123281.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_09/image-20211018173123281.png"/>
|
||||
|
||||
|
||||
|
||||
@@ -627,7 +627,7 @@ F7进入`lookupHandlerMethod(lookupPath, request)`
|
||||
|
||||
### 返回到AbstractHandlerMethodMapping#getHandlerInternal()
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_09/image-20211018185954647.png"/>
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_09/image-20211018185954647.png"/>
|
||||
|
||||
这个时候是已经找到了由哪个处理器处理,接着返回
|
||||
|
||||
@@ -635,7 +635,7 @@ F7进入`lookupHandlerMethod(lookupPath, request)`
|
||||
|
||||
返回到这一步,准备执行`getHandlerExecutionChain(handler, request)`
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_09/image-20211018190338925.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_09/image-20211018190338925.png" />
|
||||
|
||||
|
||||
|
||||
@@ -661,20 +661,20 @@ F7进入`lookupHandlerMethod(lookupPath, request)`
|
||||
}
|
||||
```
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_09/image-20211018190711035.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_09/image-20211018190711035.png" />
|
||||
|
||||
- 咱们没写拦截器,就没有。
|
||||
- 继续往回返
|
||||
|
||||
### 返回到DispatcherServlet#getHandler()
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_09/image-20211018190924151.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_09/image-20211018190924151.png" />
|
||||
|
||||
这里就是责任链模式,有能处理的handler就直接返回
|
||||
|
||||
### 返回到DispatcherServlet#doDispatch()
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_09/image-20211018191048955.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_09/image-20211018191048955.png" />
|
||||
|
||||
自此RequestMappingHandlerMapping处理结束
|
||||
|
||||
@@ -754,9 +754,9 @@ class MappingRegistry {
|
||||
|
||||
### Debug调用栈
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_09/image-20211018174537002.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_09/image-20211018174537002.png" />
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_09/image-20211018174827232.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_09/image-20211018174827232.png" />
|
||||
|
||||
意料之中,启动应用的时候从init初始化那里调用过来了
|
||||
|
||||
@@ -808,7 +808,7 @@ public void afterPropertiesSet() {
|
||||
|
||||
### AbstractHandlerMethodMapping#initHandlerMethods()初始化HandlerMethods
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_09/image-20211018175412239.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_09/image-20211018175412239.png" />
|
||||
|
||||
|
||||
|
||||
@@ -890,7 +890,7 @@ public void afterPropertiesSet() {
|
||||
|
||||
|
||||
|
||||
<img src="https://upyunimg.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_09/image-20211018183141571.png" />
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_09/image-20211018183141571.png" />
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user