2010-01-04 8 views
3

Je souhaite que le moteur de gabarit soit disponible dans les servlets. L'implémentation concrète du moteur de gabarit doit être modifiable derrière l'interface TemplateEngine. Avec l'injection de dépendance habituelle, il pourrait ressembler à ceci:Dépend de l'injection dans le champ statique

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); 
    } 

} 

L'inconvénient de cette approche est que chaque Servlet qui veut utiliser la méthode render doit étendre BaseServlet. Par conséquent, j'aimerais avoir une méthode de rendu importée statiquement.

public class TemplateEngineWrapper { 

    @Inject 
    static TemplateEngine templateEngine; 

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

} 

Dans le Servlet je l'utiliser de cette façon:

import static TemplateEngineWrapper.render; 

... 

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

... 

un problème avec cette approche? Si oui: que suggérez-vous plutôt?

Répondre

7

Le problème avec cette approche est qu'il couple étroitement vos Servlets à une seule implémentation de render (c'est un singleton déguisé). Éviter ce couplage étroit est un avantage majeur de Dependency Injection. Il serait préférable d'avoir le moteur de rendu injecté dans chaque servlet en utilisant:

@Inject 
    private TemplateEngine templateEngine; 

si vous voulez éviter d'avoir à hériter de BaseServlet (compréhensible, car il vous enferme dans une hiérarchie de classes).

Questions connexes