![86c057efd9116fff326f6a210371625d.png](https://img-blog.csdnimg.cn/img_convert/86c057efd9116fff326f6a210371625d.png)
bean都是保存在容器中的,所以我们首先需要有容器,
实际上是通过一个叫ContextLoaderListener的监听器来完成这个操作的,具体可以看这篇文章:
反正我手长:JavaWeb技术(9):Listenerzhuanlan.zhihu.com![b1d8d26deb2526ade84eb947b4a55ead.png](https://img-blog.csdnimg.cn/img_convert/b1d8d26deb2526ade84eb947b4a55ead.png)
加载完容器后:
![c3be5bfc8e0f50bd719501bf78d04a73.png](https://img-blog.csdnimg.cn/img_convert/c3be5bfc8e0f50bd719501bf78d04a73.png)
我们发现容器里面已经有我们用户配置bean的bean.xml了:
![37bf2bfb377b325dc0718283b75552b9.png](https://img-blog.csdnimg.cn/img_convert/37bf2bfb377b325dc0718283b75552b9.png)
但是getBean的时候报了错,让我们在用容器获取bean之前初始化一个叫BeanFactory的东西:
![e678ca93de29d73ee058d54205295dbf.png](https://img-blog.csdnimg.cn/img_convert/e678ca93de29d73ee058d54205295dbf.png)
并且直接明说让我们调用refresh方法:
![e35cbcc3f9c16cd3e89295734e551b0d.png](https://img-blog.csdnimg.cn/img_convert/e35cbcc3f9c16cd3e89295734e551b0d.png)
接下就一步步step over,直到wac.getBean("dataSource")有值:
![16c6159872b2f4324d748ab6da2cc685.png](https://img-blog.csdnimg.cn/img_convert/16c6159872b2f4324d748ab6da2cc685.png)
invokeBeanFactoryPostProcessors的功劳:帮我们实例化并调用了所有的BeanFactoryPostProcessor bean,
但我们发现,一直到所有bean创建初始化成功,开始发布事件了,我还是没能get到Controller:
![9db4663b7ae621989bb93c30b643566b.png](https://img-blog.csdnimg.cn/img_convert/9db4663b7ae621989bb93c30b643566b.png)
而且BeanDefine里面也没有Controller的信息,
其实是因为Controller扫描包的操作是配置在spring-mvc.xml中的,而spring-mvc.xml是配置在DispatcherServlet中的:
<servlet>
<servlet-name>SpringMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- contextConfigLocation不是必须的 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>SpringMVC</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
注意这个时候,程序的debug还卡在ContextLoaderListener呢,肯定就找不到Controller啊,
现在我把扫描包的操作放到spring-xml中来验证我的猜想:
<context:component-scan base-package="top.wangruns.trackstacking.controller" />
![dd13b910dd7444feb9210d1e78074d33.png](https://img-blog.csdnimg.cn/img_convert/dd13b910dd7444feb9210d1e78074d33.png)
BeanDefine的数量比刚才多了15个,正好是我Controller的数量,
但我们发现还是getBean不到Controller,
我们接着往下debug,看到有个方法,他的作用是初始化剩下的没被初始化的勤快加载的单例:
![4aabc9ffc15e2c87588bc53aa1fed023.png](https://img-blog.csdnimg.cn/img_convert/4aabc9ffc15e2c87588bc53aa1fed023.png)
![c6d2b91a5b550cb35fcffd32a92769a9.png](https://img-blog.csdnimg.cn/img_convert/c6d2b91a5b550cb35fcffd32a92769a9.png)
初始化成功:
![fdc1657976f4f7be79e676d673b825ca.png](https://img-blog.csdnimg.cn/img_convert/fdc1657976f4f7be79e676d673b825ca.png)