Estou tentando entender a diferença entre alternative e specialises mas eles me parecem fazer exatamente a mesma coisa, a unica diferença que encontrei ao que me parece é que specialized usa herança .
Estou tentando entender a diferença entre alternative e specialises mas eles me parecem fazer exatamente a mesma coisa, a unica diferença que encontrei ao que me parece é que specialized usa herança .
Fala aí Alexandre, blz?
O @Specializes
é justamente para uso de herança, quando você quer criar uma especialização de algum bean já existente.
Já o @Alternative
é sempre uma alternativa para um bean. Vamos exemplificar o @Alternative
com um `EntityManager.
Você em seu projeto criou um produtor de EntityManager
que acessa o banco de produção.
Porém quando você está em desenvolvimento você não quer que esse EntityManager
que acessa o banco de produção seja injetado. Você poderia usar um outro produtor de EntityManger
que acessa um banco de dados local ou de desenvolvimento. Anota esse produtor com @Alternative
e habilita ele no beans.xml
.
Dessa forma ao rodar em desenvolvimento sempre será injetado uma alternativa para o EntityManager
ao invés de injetar o que se conecta ao banco de produção.
Um uso bem comum para @Alternative
é para evolução de uma classe especifica. Vamos supor que você está em um sistema legado, e precisa fazer uma alteração grande em uma determinada classe
e essa classe implementa uma interface
.
Você pode criar outra classe
que implemente essa interface
e anota-la com @Alternative
e habilita-la (via bean.xml
ou @Priority
). Fazendo isso você deixará de utilizar a versão antiga da classe e passará a utlizar a versão nova (a alternativa).
Espero ter ajudado!