将依赖项注入静态字段

dea*_*mon 3 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);
    }

}
Run Code Online (Sandbox Code Playgroud)

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

public class TemplateEngineWrapper {

  @Inject
  static TemplateEngine templateEngine;

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

}
Run Code Online (Sandbox Code Playgroud)

在Servlet中我会这样使用它:

import static TemplateEngineWrapper.render;

...

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

...
Run Code Online (Sandbox Code Playgroud)

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

Jam*_*dle 8

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

  @Inject
  private TemplateEngine templateEngine;
Run Code Online (Sandbox Code Playgroud)

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