2011-11-25 219 views
8

我不知道如何处理一个简单的guice示例。阅读文档我已经做了以下后:Guice Servlets的简单示例

  • 设置的guiceFilter
  • 创造了一个注射器,并在GuiceServletContextListener实例化一个新的servlet和添加侦听到web.xml
  • 在配置servlet的约束serve("*.jsp").with(IndexController.class);

当我这样做后,我该如何使用依赖注入?比方说,我有一个index.jsp,IndexController.class(s​​ervlet)和两个名为Person和Order的Person,其中Person依赖于Order。如何通过guice将Order依赖注入到Person构造函数中,并且在我这样做之后,我需要返回将此人的命令列表返回给控制器?我以前在ASP.NET MVC中使用过Ninject,这很简单,但是我很困惑如何使用Guice实现最简单的DI示例。谢谢。

回答

20

要开始,下面是一个示例,该示例将注入名称列表的服务注入到索引控制器中。 (在这个例子中没有欺骗,一切都是明确的)。

ListService接口定义了简单的服务。

public interface ListService { 
    List<String> names(); 
} 

DummyListService提供了简单的实现。

public class DummyListService implements ListService { 
    public List<String> names() { 
     return Arrays.asList("Dave", "Jimmy", "Nick"); 
    } 
} 

ListModule电线ListService到哑实现。

public class ListModule extends AbstractModule { 
    @Override 
    protected void configure() { 
     bind(ListService.class).to(DummyListService.class); 
    } 
} 

GuiceServletContextListener执行映射servlet来索引,并且如上文创建ListModule

@Override 
protected Injector getInjector() { 
    return Guice.createInjector(
      new ServletModule() { 
       @Override protected void configureServlets() { 
        serve("/index.html").with(IndexController.class); 
       } 
      }, 
      new ListModule()); 
} 

IndexController提出的名称到请求范围(手动地)并转发到JSP页面。

@Singleton 
public class IndexController extends HttpServlet { 

    @Inject ListService listService; 

    @Override 
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
     req.setAttribute("names", listService.names()); 
     req.getRequestDispatcher("/WEB-INF/jsp/index.jsp").forward(req, resp); 
    } 

} 

JSP页面转储名(仅片段)。

<c:forEach items="${names}" var="name"> 
    ${name}<br/> 
</c:forEach> 
+0

@Dave感谢这个令人难以置信的例子。一个问题...应该ListModule扩展ServletModule还是没有必要? – Robert

+1

@Robert Nope;它不是一个servlet模块。 [Servlet模块](http://google-guice.googlecode.com/svn/tags/3.0/javadoc/com/google/inject/servlet/ServletModule.html)明确用于配置请求处理程序AFAICT。另外你不能使用'ServletModule.configure()'做同样的工作,因为它是一个'final'方法。 –

+0

@Dave啊......我完全错过了。谢谢您的帮助。非常感谢。 – Robert