SpringMVC底層機制簡單實現-02 https://github.com/liyuelian/springmvc-demo.git 4.任務3-從web.xml動態獲取容器配置文件 4.1分析 任務3:MyDispatcherServlet (自定義的前端分發器)在創建並初始化自定義的spri ...
SpringMVC底層機制簡單實現-02
4.任務3-從web.xml動態獲取容器配置文件
4.1分析
任務3:MyDispatcherServlet (自定義的前端分發器)在創建並初始化自定義的spring容器時,可以動態地從web.xml中獲取到配置的容器文件。
我們之前實現的時候,是直接在 MyWebApplicationContext 中指定要讀取的容器文件。
改進:在web.xml中通過init-param指定容器文件,然後通過讀取web.xml獲取即可。這樣可以動態地讀取容器文件,不需要改變源代碼。
4.2代碼實現
(1)修改 MyDispatcherServlet 的 init 方法。通過 ServletConfig 對象,獲取 Servlet 的初始化參數 init-param,將該參數的值傳入 spring 容器的初始化方法。
部分代碼:
@Override
public void init(ServletConfig servletConfig) throws ServletException {
/** web.xml文件,前端控制器的配置中:
* <init-param>
* <param-name>contextConfigLocation</param-name>
* <param-value>classpath:myspringmvc.xml</param-value>
* </init-param>
*/
//configLocation ==> classpath:myspringmvc.xml
String configLocation =
servletConfig.getInitParameter("contextConfigLocation");
//初始化ioc容器,傳入指定的spring配置文件
myWebApplicationContext = new MyWebApplicationContext(configLocation);
myWebApplicationContext.init();
//調用 initHandlerMapping(),完成url和控制器方法的映射
initHandlerMapping();
//測試輸出 handlerList
System.out.println("handlerList輸出的結果=" + handlerList);
}
(2)修改 MyApplicationContext 自定義spring 容器,額外提供一個帶參構造器,用於獲取傳入的 容器配置文件名,然後傳給 MyApplicationContext 的 init() 方法去初始化。
部分代碼:
//無參構造器
public MyWebApplicationContext() {
}
//表示spring容器配置文件名
private String configLocation;
//帶參構造器
public MyWebApplicationContext(String configLocation) {
this.configLocation = configLocation;
}
/**
* 該方法完成對自己的 spring容器的初始化
*/
public void init() {
//configLocation的值是 classpath:myspringmvc.xml
// 按冒號分割,取索引為 1的子串:myspringmvc.xml
String basePackage =
XMLParse.getBasePackage(configLocation.split(":")[1]);
String[] basePackages = basePackage.split(",");
if (basePackages.length > 0) {
//遍歷這些包
for (String pack : basePackages) {
scanPackage(pack);
}
}
System.out.println("掃描後的路徑classFullPathList=" + classFullPathList);
//將掃描到的類反射到ioc容器
executeInstance();
System.out.println("掃描後的ioc容器=" + ioc);
}
//scanPackage方法,略..該方法完成對包的掃描
//executeInstance方法,略..該方法將掃描到的類,在滿足條件的情況下進行反射,並放入到ioc容器中