【问题标题】:Simple Example with Guice ServletsGuice Servlet 的简单示例
【发布时间】:2012-01-06 16:38:17
【问题描述】:

我不知道如何继续一个简单的 guice 示例。阅读文档后,我做了以下事情:

  • 设置 guiceFilter
  • 创建了一个注入器并在 GuiceServletContextListener 中实例化了一个新的 ServletModule 并将监听器添加到 web.xml
  • 在配置 servlet 中绑定 serve("*.jsp").with(IndexController.class);

完成之后,我该如何使用依赖注入?假设我有一个 index.jsp、IndexController.class (servlet) 和两个名为 Person 和 Order 的类,其中 Person 取决于 Order。如何通过 guice 将 Order 依赖项注入到 Person 构造函数中,然后我需要将这个人的订单列表返回给控制器?我过去曾将 Ninject 与 ASP.NET MVC 一起使用,这非常简单,但我对如何使用 Guice 实现最简单的 DI 示例感到非常困惑。谢谢。

【问题讨论】:

    标签: java model-view-controller dependency-injection guice


    【解决方案1】:

    首先,这是一个将返回名称列表的服务注入索引控制器的示例。 (本例中没有任何技巧,一切都是明确的。)

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

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

    DummyListService 提供了简单的实现。

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

    ListModuleListService 连接到虚拟实现。

    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>
    

    【讨论】:

    • @Dave 感谢这个令人难以置信的例子。一个问题... ListModule 应该扩展 ServletModule 还是没有必要?
    • @Robert Nope;它不是一个 servlet 模块。 Servlet modules 明确用于配置请求处理程序 AFAICT。另外,您不能使用ServletModule.configure() 来完成相同的工作,因为它是final 方法。
    • @Dave Ah...我完全错过了。谢谢您的帮助。非常感谢。
    • @Robert 没问题 :) 这一切对我来说似乎有点笨拙,虽然我还不熟悉 Guice IDE 插件。
    猜你喜欢
    • 2012-10-20
    • 1970-01-01
    • 2016-02-19
    • 1970-01-01
    • 2013-07-09
    • 1970-01-01
    • 2014-09-18
    • 2013-10-13
    • 1970-01-01
    相关资源
    最近更新 更多