手動建立(new)物件,使用spring容器中的bean(ServletContext)。
阿新 • • 發佈:2019-02-10
場景:一個不受spring管理的靜態工廠方法,根據傳入的引數不同,返回不同的實現類物件(關鍵點:實現類物件需要使用spring容器中的資料訪問層物件dao或mapper)。
疑難點:如何從spring容器中獲取bean,並注入到自己new出來的物件中。
解決方案:使用spring的autoware機制+static,spring的autoware自動裝配:只要類實現了ServletContextAware介面,web容器初始化時,就會將servletcontext注入到該類中(注意該類在spring的ioc容器中,自己new出來的類spring是不會幫你注入的),但是靜態工廠方法又需要自己親手new,該怎麼辦呢?。。。這時我們使用static關鍵字修飾spring注入的servletContext,以達到共享使用servletContext的效果(注意:這時不是spring幫你注入了,而是第一次spring自己建立物件,它把servletContext注入到它可以管理的bean中,而該bean的servletcontext是用static關鍵字修飾的-存放到了記憶體區中;我們再次new時使用的是記憶體區中的servetContext)。
缺點:spring建立的bean物件,我們並沒有使用(使用的是自己new出來的物件),浪費了該資源。
service實現類
靜態工廠方法@Service public class BuyerServiceImplTest1 implements ServletContextAware,BuyerService{ private static ServletContext servletContext; @Override public void setServletContext(ServletContext servletContext) { BuyerServiceImplTest1.servletContext = servletContext; } public BuyerServiceImplTest1(){ }
public class StaticService {
public static BuyerService getBuyerService(String serviceFlag){
if("1".equals(serviceFlag)){
return new BuyerServiceImplTest1();
}
return null;
}
}
使用靜態工廠方法獲取實現類
public void saveUserLoginInfoToRedis(String uniqueKey, String username) { BuyerService buyerService = StaticService.getBuyerService("1"); System.out.println(buyerService); Buyer buyerFirstTest = buyerService.getBuyerByUsername(null); System.out.println(buyerFirstTest.getRealName());