Eu encontrei esta pergunta: Qual é a diferença entre @Inject e @EJB, mas eu não fiquei mais sábio. Eu não havia feito o Java EE antes nem tenho experiência com injeção de dependência, portanto não entendo o que devo usar?
@EJB é uma maneira antiga de injetar? A injeção feita pelo contêiner EJB ao usar esta anotação durante o uso do @Inject usa a nova estrutura CDI? Essa é a diferença e devo usar o @Inject em vez do @EJB, se este for o caso?
fonte
@EJB
funciona para injeção circular (um feijão singleton e outro feijão precisando de uma referência um para o outro)? (com referência a minha resposta abaixo - eu não tenho certeza se estou fazendo a coisa certa ao mudar para@EJB
)@Inject
pode injetar qualquer bean, enquanto@EJB
só pode injetar EJBs. Você pode usar para injetar EJBs, mas eu preferiria em@Inject
qualquer lugar.fonte
Atualização: Esta resposta pode estar incorreta ou desatualizada. Veja os comentários para obter detalhes.
Eu mudei de
@Inject
para@EJB
porque@EJB
permite injeção circular enquanto@Inject
vomita.Detalhes: eu precisava
@PostConstruct
chamar um@Asynchronous
método, mas o faria de forma síncrona. A única maneira de fazer a chamada assíncrona era fazer com que a chamada original fosse um método de outro bean e retornasse o método do bean original. Para fazer isso, cada feijão precisava de uma referência ao outro - portanto circular.@Inject
falhou nesta tarefa enquanto@EJB
funcionava.fonte
@Inject
elas nos campos públicos uma da outra. Se isso funcionar, então minha resposta está errada. Se isso não funcionar, minha resposta está correta até agora. Em seguida, mude@Inject
para@EJB
(e, possivelmente, anote as próprias classes? Eu esqueço.). Então a injeção mútua cíclica deve funcionar bem. Por isso mudei@Inject
para@EJB
. Espero que isso faça sentido.Aqui está uma boa discussão sobre o tópico. Gavin King recomenda @Inject sobre @EJB para EJBs não remotos.
http://www.seamframework.org/107780.lace
ou
https://web.archive.org/web/20140812065624/http://www.seamframework.org/107780.lace
e
fonte
Também pode ser útil entender a diferença em termos de Identidade do Bean de Sessão ao usar @EJB e @Inject. De acordo com as especificações, o código a seguir será sempre
true
:Usar @Inject em vez de @EJB não é o mesmo.
consulte também a identidade dos beans de sessão sem estado para obter mais informações
fonte
A injeção já existia no Java EE 5 com as anotações @Resource, @PersistentUnit ou @EJB, por exemplo. Mas estava limitado a certos recursos (fonte de dados, EJB...) E a certos componentes (Servlets, EJBs, JSF backing bean...). Com o CDI, você pode injetar praticamente qualquer coisa em qualquer lugar, graças à anotação @Inject.
fonte