RedCloud Help

高仿IOC与DI

从Servlet到ApplicationContext

我们已经了解SpringMVC的入口是DispatcherServlet,我们实现了DispatcherServlet的initial()方法。在init()方法中完成了IOC容器的初始化。而在我们使用Spring的经验中,我们见得最多的是ApplicationContext,似乎Spring托管的所有实例Bean都可以通过调用getBean()方法来获得。哪么ApplicationContext又是从何而来的呢?从Spring源码中我们可以看出,DispatcherServlet的类图如下:

Aware
ApplicationContextAware
EnvironmentAware
HttpServletBean
FrameworkServlet
DispatcherServlet
Serializable
GenericServlet
Servlet
ServletConfig

DispatcherServlet继承了FrameworkServlet,FrameworkServlet继承了HttpServletBean,HttpServletBean继承了HttpServlet。在HttpServletBean的init()方法中调用了FrameworkServlet的initServletBean()方法,在initServletBean()方法中初始化WebApplicationContext实例。在initServletBean()方法中调用了DispatcherServlet重写的onRefresh()方法。在DispatcherServlet的onRefresh()方法中又调用了initStrategies()方法,初始化SpringMVC的九大组件。其实,上面复杂的调用关系,我们可以简单的得出一个结论:就是Servlet的init方法中初始化了IOC容器和SpringMVC所依赖的九大组件。

高仿真的类关系图

我们先来将自己要手写的框架类关系画出来,顺便也回顾一下我们上堂课讲过的IOC容器结构。

GPAbstractApplicationContext
GPDefaultListableBeanFactory
GPApplicationContext
GPBeanFactory

项目环境搭建

application.properties配置

还是先从application.properties文件开始,用application.properties来代替application.xml,具体配置如下:

完成DI依赖注入功能

在之前的源码分析中,我们已经了解到,依赖注入的入口是从getBean()方法开始的,前面的IOC手写部分基本流程已通。先在AppliationContext中定义好IOC容器,一个BeanWrapper,一个实单例对象缓存

03 May 2025