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)
这种方法有问题吗?如果是这样的话:你会建议什么呢?
这种方法的问题在于它将您的Servlet紧密地耦合到渲染的单个实现(它是伪装的单例).避免这种紧密耦合是依赖注入的主要优点.使用以下方法将渲染器注入每个servlet会更好:
@Inject
private TemplateEngine templateEngine;
Run Code Online (Sandbox Code Playgroud)
如果你想避免必须从BaseServlet继承(可以理解,因为它将你锁定到一个类层次结构).