启动Spring容器,加载xml配置文件
![](https://i-blog.csdnimg.cn/blog_migrate/6b7e725091096b635b15e775754c3902.png)
调用本类构造器,设置配置文件路径,然后执行refresh方法。
![](https://i-blog.csdnimg.cn/blog_migrate/a4adf9720d141ee54593fa5c2836c0c9.png)
refresh方法。
![](https://i-blog.csdnimg.cn/blog_migrate/03a7220a597f7c309efd523d0a5ae512.png)
refresh中继续执行:
![](https://i-blog.csdnimg.cn/blog_migrate/77d330dc170ff5d1cdd46a23c0a6ef50.png)
这里面会加载指定的xml配置文件,创建对象工厂。
refresh中继续执行:
![](https://i-blog.csdnimg.cn/blog_migrate/175b83ec87eab8440e4400d6dbd523cc.png)
prepareBeanFactory中对象工厂的一些设置。
继续执行:
支持国际化功能的:
![](https://i-blog.csdnimg.cn/blog_migrate/8f2f80e2c815e2b886636caa05059ee0.png)
初始化所有单实例bean:
![](https://i-blog.csdnimg.cn/blog_migrate/69be6cef40eba72803556321345be7f9.png)
其中:
![](https://i-blog.csdnimg.cn/blog_migrate/9fa1e93ee3e13154f8eb957d306cd2d0.png)
再其中:拿到所有bean的名字
![](https://i-blog.csdnimg.cn/blog_migrate/e4c2ef4cb69de795f602e41a2f68fc75.png)
然后,按顺序创建所有非懒加载的,单例的,非抽象的bean。
![](https://i-blog.csdnimg.cn/blog_migrate/de1c7bfb8e9f655e9fd8d23d60c31a72.png)
![](https://i-blog.csdnimg.cn/blog_migrate/8d035f9a490f8a65d3424792b4f45d8b.png)
![](https://i-blog.csdnimg.cn/blog_migrate/1b82ea1ce812c19d54b088b382e062cc.png)
所有的getBean方法都是调用doGetBean方法:
![](https://i-blog.csdnimg.cn/blog_migrate/bf2a5f8cf4ea33c263c29e927c110281.png)
在doGetBean方法里:
先检查是否有这个bean,第一次创建没有的。
有就去拿
![](https://i-blog.csdnimg.cn/blog_migrate/094bf3293ba6bd72f0ddf97dede302db.png)
![](https://i-blog.csdnimg.cn/blog_migrate/671a945abd2d198649b56491cf8d5842.png)
所有单例bean放在这里:
![](https://i-blog.csdnimg.cn/blog_migrate/8e08f98b91135f2d3176b362ae679705.png)
没有就创建:
![](https://i-blog.csdnimg.cn/blog_migrate/ac9efc25799ab474712983d66d30856b.png)
getSingleton方法:
先去拿:
![](https://i-blog.csdnimg.cn/blog_migrate/99924edddabc027213c2d1127b7f52ca.png)
拿不到就创建:
![](https://i-blog.csdnimg.cn/blog_migrate/6614bcb6409ec264092dbba3055e2ec3.png)
如果是新建的就添加到容器中:
![](https://i-blog.csdnimg.cn/blog_migrate/f1dbfae1a813cf095ef76150b2d34e82.png)
返回这个单例bean:
![](https://i-blog.csdnimg.cn/blog_migrate/ab2742cd4545276045eb60e143a88a58.png)
ioc就是一个容器,单实例bean保存在一个map中;
DefaultSingletonBeanRegistry-singletonObjects;
Spring里面最大的模式就是 工厂模式;
<bean class=""></bean>
BeanFactory:bean工厂;工厂模式;帮用户创建bean
BeanFactory:bean工厂接口;负责创建bean实例;容器里面保存的所有单例bean其实是一个map;是Spring最底层的接口;
ApplicationContext:是容器接口;更多的负责容器功能的实现;(可以基于beanFactory创建好的对象之上完成强大的容器),可以从map获取这个bean。
自定义类继承ApplicationContextAware或BeanFactoryAware接口可以获得ApplicationContext或BeanFactory。