将依赖注入到静态字段中

3

我希望在Servlets中使用模板引擎。具体的模板引擎实现应该可以在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。因此,我希望有一个静态导入的render方法。
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个回答

8

这种方法的问题在于它将你的Servlet紧密地耦合到了一个渲染器实现上(它实际上是一个单例)。避免这种紧密耦合是依赖注入的一个主要优点。更好的做法是使用以下方式将渲染器注入到每个Servlet中:

  @Inject
  private TemplateEngine templateEngine;

如果您想避免继承BaseServlet(这是可以理解的,因为它会将您锁定在一个类层次结构中),则可以使用Servlet接口和HttpServlet类来创建Servlet。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接