サーブレットで 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.