将依赖项注入静态字段

时间:2010-01-04 16:26:44

标签: java servlets dependency-injection

我想在servlet中使模板引擎可用。具体的模板引擎实现应该可以在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);
    }

}

这种方法的缺点是每个想要使用render方法的Servlet都必须扩展BaseServlet。因此,我想要一个静态导入的渲染方法。

public class TemplateEngineWrapper {

  @Inject
  static TemplateEngine templateEngine;

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

}

在Servlet中我会这样使用它:

import static TemplateEngineWrapper.render;

...

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

...

这种方法有问题吗?如果是这样的话:你会建议什么?

1 个答案:

答案 0 :(得分:8)

这种方法的问题在于它将你的Servlet紧密地耦合到渲染的单个实现(它是伪装的单身)。避免这种紧密耦合是依赖注入的主要优点。使用以下方法将渲染器注入每个servlet会更好:

  @Inject
  private TemplateEngine templateEngine;

如果你想避免必须从BaseServlet继承(可以理解,因为它将你锁定到一个类层次结构中)。