1. 程式人生 > >在servlet中如何使用被Spring管理的service

在servlet中如何使用被Spring管理的service

  首先真的很感謝這篇文章的作者,我在這次的專案中遇到了這個問題,看了很多網上的資料都沒解決,直到看到這篇文章才解決,我用的是方法2.2。

 剛開始我把service設定成servlet的成員變數,不知道為什麼不行,這種方式讓這個servlet都無法使用,希望知道原因的朋友能告知。以至於我以為這篇文章也是不行,感到灰心喪氣,兩天都沒解決這個問題。剛剛我再次嘗試了一次,把service放到方法裡,設定成區域性變數,沒想到竟然成功初始化了,而且成功呼叫後臺取到值返回,讓我差點“喜極而泣”,真的很開心,明天就可以接著把專案往下做了,具體內容參照以下。再次感謝作者!

-------------分割線------------------------

原文

我的使用場景是SpringMvc+MyBatis,我總結了以下兩種方式,三種方法。兩種方式指的是採用注入方式和獲取spring管理的bean。三種方法指的是,代理注入、硬編碼獲取bean和實現ApplicationContextAware介面獲取bean。

第一種方式:採用注入方式。

編寫一個代理類,程式碼如下:

Java程式碼  收藏程式碼
  1. @SuppressWarnings("serial")  
  2. public class ProxyServlet extends HttpServlet {  
  3.     @Override  
  4.     public void service(ServletRequest req, ServletResponse res)  
  5.             throws ServletException, IOException {  
  6.         proxyServlet.service(req, res);  
  7.     }  
  8.     @Override  
  9.     public void init() throws ServletException {  
  10.         this.targetBean = getServletName();  
  11.         getServletBean();  
  12.         proxyServlet.init(getServletConfig());  
  13.     }  
  14.     private String targetBean;  
  15.     private Servlet proxyServlet;  
  16.     private void getServletBean(){  
  17.         WebApplicationContext wac = WebApplicationContextUtils  
  18.                 .getRequiredWebApplicationContext(getServletContext());  
  19.         this.proxyServlet = (Servlet) wac.getBean(targetBean);  
  20.     }  
  21. }  

    然後編寫需要注入service的servlet,程式碼如下:

Java程式碼  收藏程式碼
  1. @Component  
  2. public class MemcacheServlet extends HttpServlet {  
  3.     private static final long serialVersionUID = 1L;  
  4.     @Autowired  
  5.     private GlobalCacheService globalCacheService;  
  6.     /** 
  7.      * @see HttpServlet#HttpServlet() 
  8.      */  
  9.     public MemcacheServlet() {  
  10.         super();  
  11.     }  
  12.     /** 
  13.      * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) 
  14.      */  
  15.     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
  16.         String flag = request.getParameter("flag");  
  17.         globalCacheService.test();  
  18.         if("q".equals(flag)){  
  19.             //取快取  
  20.             String name = (String)globalCacheService.getCacheValue("_name1", Object.class);  
  21.             System.out.println("執行取快取操作: " + name);  
  22.         }else if("f".equals(flag)){  
  23.             //放快取  
  24.             String username = request.getParameter("username");  
  25.             globalCacheService.deleteCacheValue("_name1");  
  26.             if(!StringUtil.isBlank(username)){  
  27.                 System.out.println("執行存快取操作: " + username);  
  28.                 globalCacheService.setCacheValue("_name1", username, 28800);  
  29.             }else{  
  30.                 System.out.println("執行存快取操作: " + username);  
  31.                 globalCacheService.setCacheValue("_name1""lzx"28800);  
  32.             }  
  33.         }  
  34.     }  
  35.     /** 
  36.      * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) 
  37.      */  
  38.     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
  39.         response.setContentType("text/html");  
  40.         this.doGet(request, response);  
  41.     }  
  42. }  

    最後在web.xml中配置如下:

Xml程式碼  收藏程式碼
  1. <servlet>  
  2.     <servlet-name>memcacheServlet</servlet-name>  
  3.     <servlet-class>com.hsis.core.servlet.web.ProxyServlet</servlet-class>  
  4.   </servlet>  
  5. <servlet-mapping>  
  6.     <servlet-name>memcacheServlet</servlet-name>  
  7.     <url-pattern>*.to</url-pattern>  
  8.   </servlet-mapping>  

    第二種方式獲取spring管理的service,採用硬編碼或者實現AplicationContextAware介面。

      2.1 採用硬編碼方法如下:

Java程式碼  收藏程式碼
  1. ApplicationContext ctx = WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext);  
  2. 或者  
  3. WebApplicationContext wac = WebApplicationContextUtils.getWebApplicationContext(servletContext);  
  4. LzxService lzxService = (LzxService)wac.getBean("lzxService");  

    注:WebApplicationContext繼承的ApplicationContext。

      2.2 採用實現AplicationContextAware介面方法,首先建立一個類SpringContextUtil,程式碼如下:

Java程式碼  收藏程式碼
  1. import org.springframework.beans.BeansException;  
  2. import org.springframework.context.ApplicationContext;  
  3. import org.springframework.context.ApplicationContextAware;  
  4. public class SpringContextUtil implements ApplicationContextAware {  
  5.     private static ApplicationContext applicationContext;  
  6.     @Override  
  7.     public void setApplicationContext(ApplicationContext applicationContext)  
  8.             throws BeansException {  
  9.         applicationContext = applicationContext;  
  10.     }  
  11.     public static ApplicationContext getApplicationContext(){  
  12.         return applicationContext;  
  13.     }  
  14.     public static Object getBean(String name){  
  15.         return applicationContext.getBean(name);  
  16.     }  
  17.     public static <T> T getBean(String name, Class<T>  requiredClass){  
  18.         return applicationContext.getBean(name, requiredClass);  
  19.     }  
  20. }  

 applicationContext.xml中配置一下:

Java程式碼  收藏程式碼
  1. <bean class=”SpringContextUtil” />  

     在servlet中使用即可:

Java程式碼  收藏程式碼
  1. globalCacheService = (GlobalCacheService) SpringContextUtil.getBean("globalCacheService", GlobalCacheService.class);  

     注:實現Aware介面的類,初始化之後可以獲取對應的資源,實現ApplicationContextAware介面的bean,初始化後被注入applicationContext例項。

      如果使用ClassPathXmlApplicationContext、FileSystemClassPathXmlApplicationContext和FileSystemXmlApplicationContext等物件去載入Spring配置檔案,會生成一個新的application物件,這樣會產生冗餘。