2010-01-04 2 views
3

Я хочу создать механизм шаблонов в сервлетах. Конкретная реализация механизма шаблона должна быть изменена за интерфейсом 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); 
    } 

} 

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

import static TemplateEngineWrapper.render; 

... 

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

... 

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

ответ

7

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

@Inject 
    private TemplateEngine templateEngine; 

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