Guice Servlets的简单示例
我不知道如何处理一个简单的guice示例。 阅读完文档后,我完成了以下工作:
- 设置guiceFilter
- 创建一个注入器并在
GuiceServletContextListener
实例化一个新的ServletModule并将该侦听器添加到web.xml - bound
serve("*.jsp").with(IndexController.class);
在配置servlet中
在我完成之后如何使用dependency injection? 假设我有一个index.jsp,IndexController.class(servlet),以及两个名为Person和Order with Person的类,具体取决于Order。 如何通过guice将Orderdependency injection到Person构造函数中,在我这样做之后,我需要返回说这个人的命令列表回到控制器? 我在过去使用过Ninject和ASP.NET MVC,这很简单,但我对如何使用Guice实现最简单的DI示例感到很困惑。 谢谢。
首先,这是一个注入服务的示例,该服务将名称列表返回到索引控制器中。 (在这个例子中没有任何诡计,一切都是明确的。)
ListService
接口定义了简单的服务。
public interface ListService { List names(); }
DummyListService
提供了简单的实现。
public class DummyListService implements ListService { public List 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页面转储名称(仅限片段)。
${name}