Простой пример с сервлетами Guice - PullRequest
8 голосов
/ 26 ноября 2011

Я не знаю, как поступить с простым примером. После прочтения документации я сделал следующее:

  • настройка фильтра guiceFilter
  • создал инжектор и создал новый ServletModule в GuiceServletContextListener и добавил слушателя в web.xml
  • связанный serve("*.jsp").with(IndexController.class); в сервлетах конфигурации

После того, как я это сделал, как мне использовать внедрение зависимостей? Допустим, у меня есть index.jsp, IndexController.class (сервлет) и два класса с именами Person и Order с Person в зависимости от Order. Как мне вставить зависимость Order в конструктор Person с помощью guice, и после этого мне нужно будет вернуть список заказов этого человека обратно в контроллер? В прошлом я использовал Ninject с ASP.NET MVC, и это было довольно просто, но я очень запутался, как реализовать даже самый простой пример DI с Guice. Спасибо.

1 Ответ

22 голосов
/ 26 ноября 2011

Для начала, вот пример, который внедряет службу, возвращающую список имен в контроллер индекса.(В этом примере нет хитрости, все явно.) Интерфейс

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 реализация отображает сервлетдля индексации и создает 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>
...