Вставить зависимость в статическое поле - PullRequest
3 голосов
/ 04 января 2010

Я хочу сделать движок шаблонов доступным в сервлетах. Конкретная реализация механизма шаблонов должна быть изменяемой за интерфейсом TemplateEngine. При обычном внедрении зависимости это может выглядеть так:

public abstract class BaseServlet extends HttpServlet {

    private TemplateEngine templateEngine;

    public void setTemplateEngine(TemplateEngine te) {
      templateEngine = te;
    }

    protected void render(Result result, HttpServletResponse response) {
      templateEngine.render(result, resonse);
    }

}

Недостатком этого подхода является то, что каждый сервлет, который хочет использовать метод рендеринга, должен расширять BaseServlet. Поэтому я хотел бы иметь статически импортированный метод рендеринга.

public class TemplateEngineWrapper {

  @Inject
  static TemplateEngine templateEngine;

  public static void render(Result result, HttpServletResponse response) {
    templateEngine.render(result, resonse);
  }

}

В сервлете я бы использовал его так:

import static TemplateEngineWrapper.render;

...

public void doGet(...) {
  render(new Result(200, "Everything is fine."), response);
}

...

Что-то не так с этим подходом? Если так: что бы вы предложили вместо этого?

1 Ответ

8 голосов
/ 04 января 2010

Проблема этого подхода заключается в том, что он тесно связывает ваши сервлеты с одной реализацией рендера (это замаскированный синглтон). Избегание этой жесткой связи - главное преимущество Dependency Injection. Было бы лучше, чтобы визуализатор вводился в каждый сервлет с помощью:

  @Inject
  private TemplateEngine templateEngine;

, если вы хотите избежать наследования от BaseServlet (понятно, потому что он блокирует вас в одной иерархии классов).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...