injeção de dependência EJB

Olá pessoal,

Estou com uma dúvida em relação aos EJB’s. A forma mais correta de se obter um EJB é por meio de injeção de dependências ou JNDI? ou tanto faz?

Fiz esse Servlet que acessa um EJB:

public class ServletSaudacao extends HttpServlet {
    @EJB
    private SaudacaoRemote saudacao;
    /** 
     * Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        String result = saudacao.saudacao(request.getParameter("nome"));
        request.setAttribute("result", result);
        request.getRequestDispatcher("index.jsp").forward(request, response);
/*        try {
            InitialContext ic = new InitialContext();

        } catch (NamingException ex) {
            ex.printStackTrace();
        }*/
    } 

    // <editor-fold defaultstate="collapsed" desc="Métodos HttpServlet. Clique no sinal de + à esquerda para editar o código.">
    /** 
     * Handles the HTTP <code>GET</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        processRequest(request, response);
    } 

    /** 
     * Handles the HTTP <code>POST</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        processRequest(request, response);
    }

    /** 
     * Returns a short description of the servlet.
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>

}

Essa forma de acesso ao EJB está correta? Estou perguntando isso pq vi um exemplo utilizando um JSP que acessa por meio do objeto InitialContext e também se for o caso de colocar EJB’s em um ambiente de execução real.

Atualmente a melhor forma de fazer DI com EJB é usando a anotação @EJB, só não esqueça de ter certeza que está usando um application server que suporte pelo menos JEE5.

Mas pode-se usar DI de EJB em um servlet?
Considerando que há um servidor de aplicação no mínimo JEE 5 compliant.

Se não for possível deve ser fazer um lookup desse bean.

O problema de usar injeção de EJB em um servlet que ele só funciona para stateless-beans, já que você terá uma variável de instância compartilhada. Todavia não há um problema quanto a fazer isso com stateless.

Se sua aplicação no deploy for war você terá de usar um servidor com a especificação JEE 6 porque a especificação JEE 5 não permite EJB no War ja a 6 sim.

t+

Fiz um post bem objetivo sobre as novidades da JEE 6. No post tem uma enquete bem rápida sobre as novidades favoritas. Por favor, votem. Deixei o resultado parcial público para que todos tenham acesso.

O link do post é esse (OBS: não tem propaganda e nem ganho nada com isso): http://cleversonsacramento.wordpress.com/2010/08/15/as-novidades-da-jee-6/
Se não quiser ler o post e quiser ir direto para a votação, o link é esse: http://polldaddy.com/poll/3617081/

Valeu pela colaboração (para a própria comunidade) em época que cada um só quer saber de cuidar do seu próprio umbigo!