更新所有文章的图床,旧图床由于一些原因可能会逐渐失效

This commit is contained in:
youthlql
2022-03-15 01:00:37 +08:00
parent ed5227bc89
commit 7c206cc151
52 changed files with 781 additions and 781 deletions

View File

@@ -38,7 +38,7 @@ Spring源码纵览这一节主要是先了解下Spring的一些核心东西
<img src="https://unpkg.zhimg.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_01/image-20210926195844253.png" />
<img src="https://img.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_01/image-20210926195844253.png" />
- **蓝色实线箭头**是指继承关系
- **绿色虚线箭头**是指接口实现关系
@@ -91,13 +91,13 @@ BeanPostProcessor
快捷键ctrl+F12 看类的方法
<img src="https://unpkg.zhimg.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_01/image-20210926232957909.png"/>
<img src="https://img.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_01/image-20210926232957909.png"/>
#### 实现类
快捷键ctrl+h 查看接口实现类
<img src="https://unpkg.zhimg.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_01/image-20210926233308861.png"/>
<img src="https://img.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_01/image-20210926233308861.png"/>
@@ -189,7 +189,7 @@ public interface ResourceLoader {
#### 实现类
<img src="https://unpkg.zhimg.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_01/image-20210926234527992.png" />
<img src="https://img.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_01/image-20210926234527992.png" />
@@ -232,7 +232,7 @@ public interface BeanFactory {
> 源码分析小技巧:看源码时,我们可以先看一个类的接口继承关系,因为接口就是规范,大部分开源框架源码都是遵守这一规范的。
<img src="https://unpkg.zhimg.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_01/image-20210927103844753.png" />
<img src="https://img.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_01/image-20210927103844753.png" />
@@ -248,7 +248,7 @@ public interface BeanFactory {
#### AbstractApplicationContext
<img src="https://unpkg.zhimg.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_01/image-20210927104922679.png" />
<img src="https://img.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_01/image-20210927104922679.png" />
环境类的意思就是谁持有这个策略这里就解释了上文说ResourceLoader是环境类接口
@@ -265,7 +265,7 @@ public interface BeanFactory {
#### GenericApplicationContext
<img src="https://unpkg.zhimg.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_01/image-20210927105641446.png"/>
<img src="https://img.imlql.cn/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://unpkg.zhimg.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_01/image-20210927110806180.png" />
<img src="https://img.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_01/image-20210927110806180.png" />
1. BeanDefinitionRegistryBean定义信息注册中心
2. SimpleAliasRegistry别名注册中心
@@ -336,7 +336,7 @@ public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFacto
#### 流程图-BeanDefinition注册流程
<img src="https://unpkg.zhimg.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">
<img src="https://img.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">
- 我们要看BeanDefinition是何时被放入到beanDefinitionMap只需要在DefaultListableBeanFactory用到`beanDefinitionMap.put()`的地方打个断点。
- 我们在DefaultListableBeanFactory里搜索发现了registerBeanDefinition注册Bean定义信息这个方法名很像我们要找的东西再看里面的代码果然有`beanDefinitionMap.put()`这串代码,我们试着在这里打个断点
@@ -361,7 +361,7 @@ public class MainTest {
#### Debug调用栈
<img src="https://unpkg.zhimg.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_01/image-20210927142317864.png" />
<img src="https://img.imlql.cn/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://unpkg.zhimg.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_01/image-20210927172855410.png"/>
<img src="https://img.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_01/image-20210927172855410.png"/>
@@ -936,7 +936,7 @@ public class MainTest {
### ApplicationContext接口功能
<img src="https://unpkg.zhimg.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_01/image-20210927175207106.png" />
<img src="https://img.imlql.cn/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://unpkg.zhimg.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_01/image-20210927191112023.png" />
<img src="https://img.imlql.cn/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://unpkg.zhimg.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">
<img src="https://img.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">
##### Debug调用栈
@@ -1055,7 +1055,7 @@ public class MainConfig {
<img src="https://unpkg.zhimg.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_01/image-20210927200211334.png" />
<img src="https://img.imlql.cn/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://unpkg.zhimg.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_01/image-20210927230734973.png"/>
<img src="https://img.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_01/image-20210927230734973.png"/>
@@ -1434,7 +1434,7 @@ public class MainTest {
<img src="https://unpkg.zhimg.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_01/image-20210928113235852.png" />
<img src="https://img.imlql.cn/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://unpkg.zhimg.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_01/image-20210928114746618.png" />
<img src="https://img.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_01/image-20210928114746618.png" />
@@ -1497,7 +1497,7 @@ public class MainTest {
这里拿到属性值
<img src="https://unpkg.zhimg.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_01/image-20210928115110820.png" />
<img src="https://img.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_01/image-20210928115110820.png" />
@@ -1512,13 +1512,13 @@ public class MainTest {
}
```
<img src="https://unpkg.zhimg.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_01/image-20210928115352416.png"/>
<img src="https://img.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_01/image-20210928115352416.png"/>
bw就是上面说的 => 里面封装好了真正的Person对象
<img src="https://unpkg.zhimg.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_01/image-20210928115702735.png"/>
<img src="https://img.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_01/image-20210928115702735.png"/>
@@ -1528,7 +1528,7 @@ bw就是上面说的 => 里面封装好了真正的Person对象
这里就是一层一层调,不重要跳过。
<img src="https://unpkg.zhimg.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_01/image-20210928120016581.png" />
<img src="https://img.imlql.cn/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://unpkg.zhimg.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_01/image-20210928141536440.png"/>
<img src="https://img.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_01/image-20210928141536440.png"/>
@@ -1588,7 +1588,7 @@ private class BeanPropertyHandler extends PropertyHandler {
<img src="https://unpkg.zhimg.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_01/image-20210928143301161.png"/>
<img src="https://img.imlql.cn/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://unpkg.zhimg.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_01/image-20210928143910461.png" />
<img src="https://img.imlql.cn/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://unpkg.zhimg.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_01/image-20210928151825366.png"/>
<img src="https://img.imlql.cn/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://unpkg.zhimg.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_01/image-20210928153428691.png" />
<img src="https://img.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_01/image-20210928153428691.png" />

View File

@@ -97,7 +97,7 @@ public interface BeanFactoryPostProcessor {
}
```
<img src="https://unpkg.zhimg.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_02/image-20210928171641029.png"/>
<img src="https://img.imlql.cn/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://unpkg.zhimg.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_02/image-20210928172716846.png" />
<img src="https://img.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_02/image-20210928172716846.png" />
### BeanPostProcessor接口关系
<img src="https://unpkg.zhimg.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_02/image-20210928173012384.png"/>
<img src="https://img.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_02/image-20210928173012384.png"/>
DestructionAwareBeanPostProcessor接口是跟销毁有关的我们这里不分析
@@ -391,7 +391,7 @@ public class MainTest {
### 流程图-Bean生命周期与后置工厂处理器
<img src="https://unpkg.zhimg.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">
<img src="https://img.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">
### BeanDefinitionRegistryPostProcessor
@@ -399,7 +399,7 @@ public class MainTest {
##### Debug调用栈
<img src="https://unpkg.zhimg.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_02/image-20210928193241982.png"/>
<img src="https://img.imlql.cn/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://unpkg.zhimg.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_02/image-20210928203211130.png" />
<img src="https://img.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_02/image-20210928203211130.png" />
<img src="https://unpkg.zhimg.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_02/image-20210928195709384.png" />
<img src="https://img.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_02/image-20210928195709384.png" />
下面那个是Spring默认提供的后置处理器我们后面再讲。
@@ -677,11 +677,11 @@ public interface Ordered {
##### Debug调用栈
<img src="https://unpkg.zhimg.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_02/image-20210928203957687.png"/>
<img src="https://img.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_02/image-20210928203957687.png"/>
从PostProcessorRegistrationDelegate 142行开始走不同的调用代码在上面有注释
<img src="https://unpkg.zhimg.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_02/image-20210928204229225.png" />
<img src="https://img.imlql.cn/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://unpkg.zhimg.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_02/image-20210928204806052.png" />
<img src="https://img.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_02/image-20210928204806052.png" />
@@ -733,7 +733,7 @@ private static void invokeBeanFactoryPostProcessors(
##### Debug调用栈
<img src="https://unpkg.zhimg.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_02/image-20210928210240702.png" />
<img src="https://img.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_02/image-20210928210240702.png" />
@@ -741,7 +741,7 @@ private static void invokeBeanFactoryPostProcessors(
##### Debug调用栈
<img src="https://unpkg.zhimg.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_02/image-20210928210858103.png">
<img src="https://img.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_02/image-20210928210858103.png">
代码注释也是上面那个BeanDefinitionRegistryPostProcessor和BeanFactoryPostProcessor执行逻辑基本一样
@@ -779,11 +779,11 @@ public class MainConfig {
<img src="https://unpkg.zhimg.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_02/image-20210928211847405.png" />
<img src="https://img.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_02/image-20210928211847405.png" />
从这一步进来
<img src="https://unpkg.zhimg.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_02/image-20210928212026255.png" />
<img src="https://img.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_02/image-20210928212026255.png" />
@@ -791,7 +791,7 @@ public class MainConfig {
#### PostProcessorRegistrationDelegate#invokeBeanDefinitionRegistryPostProcessors()
<img src="https://unpkg.zhimg.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_02/image-20210928212134359.png" />
<img src="https://img.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_02/image-20210928212134359.png" />
F7进入
@@ -799,7 +799,7 @@ F7进入
ConfigurationClassPostProcessor配置类的后置处理
<img src="https://unpkg.zhimg.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_02/image-20210928212332382.png" />
<img src="https://img.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_02/image-20210928212332382.png" />
@@ -914,7 +914,7 @@ ConfigurationClassPostProcessor配置类的后置处理
这几个怎么来的我们后面说
<img src="https://unpkg.zhimg.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_02/image-20210928212543963.png" />
<img src="https://img.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_02/image-20210928212543963.png" />

View File

@@ -250,7 +250,7 @@ public class MainTest {
### 流程图-Bean生命周期与后置处理器
<img src="https://unpkg.zhimg.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">
<img src="https://img.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">
### BeanPostProcessor-执行无参构造
@@ -258,7 +258,7 @@ public class MainTest {
#### Debug调用栈
<img src="https://unpkg.zhimg.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_03/image-20210929142257774.png"/>
<img src="https://img.imlql.cn/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://unpkg.zhimg.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_03/image-20210929144115434.png"/>
<img src="https://img.imlql.cn/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://unpkg.zhimg.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_03/image-20210929145612361.png"/>
<img src="https://img.imlql.cn/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://unpkg.zhimg.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_03/image-20210929150155334.png"/>
<img src="https://img.imlql.cn/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://unpkg.zhimg.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_03/image-20210929160714133.png"/>
<img src="https://img.imlql.cn/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下可能有多个beanNameSpring可能是考虑到空间成本没有这样弄。
<img src="https://unpkg.zhimg.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_03/image-20210929163852056.png"/>
<img src="https://img.imlql.cn/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://unpkg.zhimg.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_03/image-20210929170557025.png" />
<img src="https://img.imlql.cn/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://unpkg.zhimg.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_03/image-20210929172115093.png" />
<img src="https://img.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_03/image-20210929172115093.png" />
### InstantiationAwareBeanPostProcessor-执行postProcessBeforeInstantiation方法
#### Debug调用栈
<img src="https://unpkg.zhimg.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_03/image-20210929172554306.png"/>
<img src="https://img.imlql.cn/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://unpkg.zhimg.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_03/image-20210929173103459.png" />
<img src="https://img.imlql.cn/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://unpkg.zhimg.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_03/image-20210929174424136.png"/>
<img src="https://img.imlql.cn/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://unpkg.zhimg.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_03/image-20210929175511913.png" >
<img src="https://img.imlql.cn/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://unpkg.zhimg.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_03/image-20210930110158555.png" />
<img src="https://img.imlql.cn/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://unpkg.zhimg.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_03/image-20210930110913527.png" />
<img src="https://img.imlql.cn/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://unpkg.zhimg.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_03/image-20210930112247246.png"/>
<img src="https://img.imlql.cn/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://unpkg.zhimg.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_03/image-20210930112621989.png"/>
<img src="https://img.imlql.cn/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://unpkg.zhimg.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_03/image-20210930113459713.png"/>
<img src="https://img.imlql.cn/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://unpkg.zhimg.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_03/image-20210930114234547.png" />
<img src="https://img.imlql.cn/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://unpkg.zhimg.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_03/image-20210930114612277.png"/>
<img src="https://img.imlql.cn/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://unpkg.zhimg.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_03/image-20210930143504497.png"/>
<img src="https://img.imlql.cn/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://unpkg.zhimg.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_03/image-20210930150311019.png"/>
<img src="https://img.imlql.cn/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://unpkg.zhimg.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_03/image-20210930150604716.png"/>
<img src="https://img.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_03/image-20210930150604716.png"/>

View File

@@ -16,7 +16,7 @@ date: 2022-01-27 21:01:02
## 流程图-bean初始化流程
<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">
<img src="https://img.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">
## AbstractApplicationContext#refresh()
@@ -206,7 +206,7 @@ date: 2022-01-27 21:01:02
## 工厂Bean的初始化方式
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_04/image-20210930171319531.png"/>
<img src="https://img.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_04/image-20210930171319531.png"/>
@@ -313,13 +313,13 @@ public class Hello {
从这里开始看调用链
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_04/image-20210930175345542.png"/>
<img src="https://img.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-20210930175539928.png"/>
<img src="https://img.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_04/image-20210930175539928.png"/>
@@ -475,13 +475,13 @@ String FACTORY_BEAN_PREFIX = "&";
最后返回
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_04/image-20210930180811270.png"/>
<img src="https://img.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-20210930181219048.png"/>
<img src="https://img.imlql.cn/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://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_04/image-20211008174534713.png"/>
<img src="https://img.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_04/image-20211008174534713.png"/>

View File

@@ -18,7 +18,7 @@ date: 2022-02-13 18:01:02
## 流程图-容器刷新
<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">
<img src="https://img.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">
## 容器创建
@@ -209,7 +209,7 @@ public class AnnotationMainTest {
上面的方法走完我们可以看看到主要是下面4个后置处理器
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_05/image-20211008212541000.png"/>
<img src="https://img.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_05/image-20211008212541000.png"/>
##### RootBeanDefinition
@@ -360,7 +360,7 @@ public class AnnotationMainTest {
走完之后,注册中心肯定多了咱们的配置类
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_05/image-20211008213900796.png"/>
<img src="https://img.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_05/image-20211008213900796.png"/>
@@ -584,7 +584,7 @@ protected void initPropertySources() {
}
```
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_05/image-20211009105903816.png"/>
<img src="https://img.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_05/image-20211009105903816.png"/>
@@ -607,11 +607,11 @@ protected void initPropertySources() {
这一步有个很关键的后置处理器
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_05/image-20211009113419863.png"/>
<img src="https://img.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-20211009114151034.png"/>
<img src="https://img.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_05/image-20211009114151034.png"/>
@@ -746,7 +746,7 @@ protected void initPropertySources() {
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_05/image-20211009115044348.png"/>
<img src="https://img.imlql.cn/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://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_05/image-20211009145119146.png"/>
<img src="https://img.imlql.cn/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://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_05/image-20211009150338205.png"/>
<img src="https://img.imlql.cn/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://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_05/image-20210928203211130.png">
<img src="https://img.imlql.cn/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://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_05/image-20211009165057518.png"/>
<img src="https://img.imlql.cn/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://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_05/image-20211009165924811.png"/>
<img src="https://img.imlql.cn/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://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_05/image-20211009170632290.png"/>
<img src="https://img.imlql.cn/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://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_05/image-20211009171641665.png"/>
<img src="https://img.imlql.cn/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://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_05/image-20211009172602037.png"/>
<img src="https://img.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_05/image-20211009172602037.png"/>
7. 继续走发现要想获得B还是要调用getBean
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_05/image-20211009172943987.png" />
<img src="https://img.imlql.cn/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://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_05/image-20211009173310844.png"/>
<img src="https://img.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_05/image-20211009173310844.png"/>
8. B也是走这一套
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_05/image-20211009175223998.png"/>
<img src="https://img.imlql.cn/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://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_05/image-20211009175603012.png"/>
<img src="https://img.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_05/image-20211009175603012.png"/>
10.
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_05/image-20211009175756620.png"/>
<img src="https://img.imlql.cn/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://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_05/image-20211009180127487.png"/>
<img src="https://img.imlql.cn/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://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_05/image-20211009180214917.png"/>
<img src="https://img.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-20211009180410898.png"/>
<img src="https://img.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_05/image-20211009180410898.png"/>
13. B全部结束之后回到A的流程A赋值工作结束了然后就开始A的初始化。初始化的过程中
<img src="https://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_05/image-20211009180807630.png"/>
<img src="https://img.imlql.cn/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://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_05/image-20211009180545206.png"/>
<img src="https://img.imlql.cn/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://npm.elemecdn.com/youthlql@1.0.6/spring-sourcecode-v1/chapter_05/循环引用.jpg">
<img src="https://img.imlql.cn/youthlql@1.0.6/spring-sourcecode-v1/chapter_05/循环引用.jpg">