Por que existem diferentes annotations de gerenciamento de beans?

Qual é a diferença entre

import javax.annotation.ManagedBean; import javax.enterprise.context.SessionScoped; 

e

 import javax.faces.bean.ManagedBean; import javax.faces.bean.SessionScoped; 

?

  1. javax.enterprise.context.SessionScoped ( JSR 346 ) e todas as outras annotations do pacote javax.enterprise.context.* mantêm o contexto do CDI . O CDI fornece um mecanismo alternativo, versátil e mais poderoso para injeção de dependência, bean e gerenciamento geral de resources dentro do espaço Java EE. É uma alternativa aos beans gerenciados pelo JSF e está configurado para até mesmo replace o mecanismo de gerenciamento do bean JSF na próxima versão do JSF .

    Atualmente, os beans anotados JSF e CDI são intercambiáveis ​​dentro de qualquer aplicativo da Web Java EE fornecido (com algumas restrições menores). No entanto, os beans anotados com CDI estendem-se muito além do domínio da camada da Web, motivo pelo qual a especificação Java EE está evoluindo para tornar o CDI o mecanismo padrão de bean e DI.

    Embora o CDI possa ser uma opção óbvia para todo o desenvolvimento do Java EE, os beans gerenciados pelo JSF são portáveis ​​nos contêineres de servlet (Tomcat) e nos servidores de aplicativos (Glassfish, JBoss, etc.). Os beans CDI podem residir apenas em servidores de aplicativos completos. Com alguns trabalhos , no entanto, o Tomcat 7 pode ser conectado para suportar o CDI.

    Especificamente, javax.enterprise.context.SessionScoped é a implementação paralela do escopo de session do JSF no CDI.

  2. javax.faces.bean.SessionScoped ( JSR 314 ) e todas as outras annotations do pacote javax.faces.bean.* mantêm o mecanismo de injeção de dependência e gerenciamento de beans específico do JSF. Feijões anotados com annotations JSF, no entanto, são úteis apenas na camada da web. Todos os escopos disponíveis com annotations JSF foram replicados na especificação CDI.

  3. javax.annotation.ManagedBean ( JSR 316 ) e outras annotations relacionadas a DI sob javax.annotation.* são uma tentativa de generalizar as annotations baseadas em JSF para outros usos dentro da especificação Java EE e realmente não devem ser usadas pelo final. desenvolvedor.

Por que eles existem? Bem, IMO, a mudança dos beans JSF para os beans CDI é uma evolução natural da tecnologia. Os feijões JSF tiveram uma boa corrida, mas os gostos de Spring, Guice e Seam deixaram claro que a tecnologia não era suficiente. Houve também a necessidade de preencher a lacuna entre os componentes da web e os EJBs, e a resposta a essa necessidade é o CDI.

Veja estas questões relacionadas também:

  • JSF: Backing beans (@ManagedBean) ou CDI Beans (@Named)?
  • Java EE 6 @ javax.annotation.ManagedBean vs. @ javax.inject.Named vs. @ javax.faces.ManagedBean