1. 程式人生 > >手動建立(new)物件,使用spring容器中的bean(ServletContext)。

手動建立(new)物件,使用spring容器中的bean(ServletContext)。

場景:一個不受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());