作者:逆夏_Pretty | 来源:互联网 | 2023-08-28 15:24
1.问题访问路径http:10.118.30.52:8088helloWorldhello后会报404错误,原因是springmvc配置文件中的包扫描路径错误.修改配置如下:
1.问题
访问路径http://10.118.30.52:8088/helloWorld/hello后会报404错误,原因是springmvc配置文件中的包扫描路径错误.修改配置如下:
2.问题跟踪发现
1.打断点到正常的controller代码中,如下图:
![](https://img.php1.cn/3cd4a/1eebe/cd5/d34245582687a4e6.webp)
2.通过观察方法的调用栈内存,可以看到方框内主要是servlet的调用方法,属于服务器端的调用,所以将断点打在spring.web的doDispatch()方法中.
![](https://img.php1.cn/3cd4a/1e618/c5a/d5d40da532c3a782.png)
3.通过观察doDispatch方法 ,可以定位到获取handler的方法,如下图是获取到的handler类及方法:
![](https://img.php1.cn/3cd4a/1eebe/cd5/2fdc212433a29829.png)
4.继续追踪这个getHandler(processedRequest)方法
会发现这个getHanler方法依然属于DispatcherServlet类,this.handlerMappings属性下的mappingRegistry属性记录了所有的springmvc的初始化bean.
![](https://img.php1.cn/3cd4a/1eebe/cd5/b428d8f746fb8d47.webp)
5.继续追踪这个this.handlerMappings属性是被谁初始化,发现初始化方法中会传入context
![](https://img.php1.cn/3cd4a/1eebe/cd5/ddcc574beb16294e.jpeg)
但是打断点后重新请求无效,发现这个initStrategies方法是服务器启动后初始化调用的.可以在下图看到调用时是继承父类中的方法调用的.
![](https://img.php1.cn/3cd4a/1eebe/cd5/b428d8f746fb8d47.webp)
继续追踪父类,通过方法调用占可以看出调用的是哪一个父类即FrameworkServlet.至此已经追踪到顶层了
![](https://img.php1.cn/3cd4a/1eebe/cd5/617c1173853af4b6.webp)
看怎么初始化所有实例bean还要追踪
![](https://img.php1.cn/3cd4a/1eebe/cd5/e62700fe09f8933e.webp)
![](https://img.php1.cn/3cd4a/1eebe/cd5/ff61bfdd3c0af92e.webp)
如下图执行完这个方法后所有的初始化类都会进入到context及webApplication中
![](https://img.php1.cn/3cd4a/1eebe/cd5/60405fda58cd0acd.webp)