サーブレットでGoogle guice

サーブレットGoogle guice を使用する場合、guice-servlet-2.0.jar を使う。
web.xml に、com.google.inject.servlet.GuiceFilter でフィルタを宣言。
サーブレットの初期化で com.google.inject.servlet.ServletModule install
のバインド定義したインジェクタを生成する。

doGet or doPost で、インジェクタより任意クラスを生成する。
任意クラスで、DIされた
HttpServletRequest
HttpServletResponse
HttpSession
を参照することが可能になる。
リクエストのパラメータは、@Inject @RequestParameters Map<String, String> で、
DIされて参照することができる。

  <filter>
    <filter-name>Guice Servlet Filter</filter-name>
    <filter-class>com.google.inject.servlet.GuiceFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>Guice Servlet Filter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
-------------------

public class HelloServlet extends HttpServlet {
   private static final long serialVersionUID = 1L;
   private Injector injector;
   public HelloServlet(){
      super();
   }
   @Override
   public void init(ServletConfig config) throws ServletException{
      super.init(config);
      this.injector = Guice.createInjector(new AbstractModule(){
            @Override
            protected void configure(){
               install(new ServletModule());
            }
         }
      );

      Logger logger = Logger.getLogger("jettyTest");
      logger.info("■ HelloServlet init()!!");
   }
   
   @Override
   protected void doGet(HttpServletRequest request,HttpServletResponse response) 
   throws ServletException,IOException{
      Dispatcher dispatch = this.injector.getInstance(SampleDoGet.class);
      dispatch.exec();
   }
   
   @Override
   protected void doPost(HttpServletRequest request,HttpServletResponse response) 
   throws ServletException,IOException{
      // TODO Auto-generated method stub
   }
   @Override
   public void destroy(){
      super.destroy();
      Logger logger = Logger.getLogger("jettyTest");
      logger.info("■ HelloServlet destroy()!!");
   }
}
------------------------------------------------
import java.io.IOException;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.log4j.Logger;
import com.google.inject.Inject;
import com.google.inject.servlet.RequestParameters;

public class SampleDoGet implements Dispatcher{
   @Inject private HttpServletRequest request;
   @Inject private HttpServletResponse response;
   @Inject @RequestParameters private Map<String, String
> params;
   @Inject private HttpSession session;


   @Override
   public void exec(){
      Logger logger = Logger.getLogger("jettyTest");
      logger.info("■■ SampleDoGet  START ■■");
      logger.info("■request = ["+ this.request.toString()+"]");
      logger.info("■response = ["+ this.response.toString()+"]");
      logger.info("■session = ["+ this.session.toString()+"]");
      logger.info("■params map = ["+ this.params.toString()+"]");
      try{
      this.response.getWriter().println("Hellow Servlet!");
      }catch(IOException e){
         logger.error("◆ IOException : "+e.getMessage(),e);
      }
      logger.info("■■ SampleDoGet  END ■■");
   }
}
------------------------------------------------
気をつけなければならないのは、サーブレットから入れ子のクラスで更にインジェクションで、
HttpServletRequest 等を取得することも可能だがinstall(new ServletModule());をHttpServlet の initで実行後の2重の実行になるので、
Google guiceより警告ログが出る。
com.google.inject.servlet.GuiceFilter setPipeline より警告
Multiple injectors detected. Please install only one ServletModule in your web application.