關於在基於spring的框架中使用static 方法的問題

dabb發表於2005-08-01
一般使用spring做框架設計的web 應用中,都是利用Webapplicationcontext這個類做為beanFactory的。而這個類是在啟動時載入的。
在應用中可能會有一些helper,或則util類,需要提供靜態方法來獲取資料,不如DeptHelper.treeListDept()。如果該類要從一個DAO裡取資料,那麼它該如何訪問ioc的beanFactory,以獲取這個DAO物件呢?
大家知道WebApplicationContext一般是透過WebApplicationContextUtils
.getRequiredWebApplicationContext(config.getServletContext());來獲取的。但是如果我們的DeptHelper.treeListDept()不能獲取一個HttpServletRequest或則ServletContext,該怎麼辦呢?
我想了個辦法,就是寫一個靜態類
ApplicationContextKeeper ,如下:
private static ApplicationContext appCtx = null;

public static ApplicationContext getAppCtx() {
return appCtx;
}

public static void init(ApplicationContext ctxVal) {
appCtx = ctxVal;
}
這個類在系統啟動時由一個servlet來初始化(就是呼叫它的init),例如:
public class ApplicationContextLoadServ extends BaseServ {

public void init(ServletConfig servletConfig) throws ServletException {
ApplicationContext ctx = WebApplicationContextUtils
.getRequiredWebApplicationContext(servletConfig.getServletContext());
ApplicationContextKeeper.init(ctx);

}

public void destroy() {
super.destroy();

}

}
該servlet的啟動順序是在spring的ContextLoaderServlet之後的,這樣就保證獲取了ApplicationContext。

這樣的話我的
DeptHelper.treeListDept()就可以這樣寫了
{
IDeptInfoDAO deptInfoDAO = (IDeptInfoDAO)ApplicationContextKeeper.getAppCtx().getBean("deptInfoDAO");
deptInfoDAO.listDeptData.....
}

當然我是初次應用,想來也不會有什麼問題。大家可以討論討論

相關文章