mirror of
https://github.com/youthlql/JavaYouth.git
synced 2026-03-14 05:43:50 +08:00
cos测试完毕,图床切回原版
This commit is contained in:
@@ -38,7 +38,7 @@ Spring源码纵览这一节,主要是先了解下Spring的一些核心东西
|
||||
|
||||
|
||||
|
||||
<img src="https://img.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://img.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://img.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://img.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://img.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://img.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://img.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://img.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://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">
|
||||
<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://img.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://img.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://img.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://img.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://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">
|
||||
<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://img.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://img.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://img.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://img.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://img.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://img.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://img.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://img.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://img.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://img.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://img.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://img.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://img.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://img.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://img.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://img.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://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">
|
||||
<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://img.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://img.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://img.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://img.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://img.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://img.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://img.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://img.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://img.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://img.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://img.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://img.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://img.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://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">
|
||||
<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://img.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://img.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://img.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://img.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://img.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://img.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://img.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://img.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://img.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://img.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://img.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://img.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://img.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://img.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://img.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://img.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://img.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://img.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://img.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://img.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://img.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://img.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://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">
|
||||
<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://img.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://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-20210930175345542.png"/>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<img src="https://img.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://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-20210930180811270.png"/>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<img src="https://img.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://img.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://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">
|
||||
<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://img.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://img.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://img.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://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-20211009113419863.png"/>
|
||||
|
||||
|
||||
|
||||
<img src="https://img.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://img.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://img.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://img.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://img.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://img.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://img.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://img.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://img.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://img.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://img.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://img.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://img.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://img.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://img.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://img.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://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-20211009180214917.png"/>
|
||||
|
||||
|
||||
|
||||
<img src="https://img.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://img.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://img.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://img.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">
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user