SpringMVC底層機制簡單實作-02
https://github.com/liyuelian/springmvc-demo.git
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容器中
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/543501.html
標籤:Java
