Para que a anotação javax.inject.Named deve ser usada?

114

Estou tentando entender o javax.injectpacote e não estou certo para que a javax.inject.Namedanotação deve ser usada. O Javadoc não explica a ideia por trás dele.

Javadoc está em http://download.oracle.com/javaee/6/api/javax/inject/Named.html

Estou usando o Spring 3.0 para escrever alguns programas de amostra, ao colocar @Namedum bean parece adicioná-lo à fábrica de bean, mas a descrição do Javadoc é tão leve que não posso dizer se esse é o comportamento padrão ou específico do Spring.

Minhas perguntas são:

  1. Qual é a diferença entre @Namede@Qualifier
  2. Como você deve dizer ao sistema Runtime que uma classe deve ser injetável em outras classes qual é a anotação para isso? O equivalente a @Componentna primavera?

Atualização 1, há uma excelente explicação de @Namede @Qualifierno artigo de Nice sobre @Namede @Qualifier https://dzone.com/articles/java-ee6-cdi-named-components agradece a @xmedeko pelo link para o comentário abaixo.

ams
fonte
A configuração do JSR-330 está fora das especificações, ou seja, específica do contêiner.
Thorbjørn Ravn Andersen
1
De acordo com os documentos do Spring, "a anotação @Named do JSR 330 pode ser usada como um meio para detectar componentes e fornecer um nome a eles. Esse comportamento é ativado automaticamente se você tiver o JAR JSR 330 no classpath." esse comportamento é exclusivo do spring ou de todos os contêineres que entendem @Named?
ams

Respostas:

87

Use @Namedpara diferenciar entre diferentes objetos do mesmo tipo vinculados no mesmo escopo.

@Named("maxWaitTime")
public long maxWaitTimeMs;

@Named("minWaitTime")
public long minWaitTimeMs;

Sem o @Namedqualificador, o injetor não saberia por quanto tempo vincular a qual variável.

  • Se você deseja criar anotações que agem como @Named, use a @Qualifieranotação ao criá-las.

  • Se você olhar @Named, ele próprio está anotado com @Qualifier.

pontes
fonte
Portanto, @Named é realmente @Qualifier, então por que @Qualifier deve ser tão genérico? A ideia é permitir que alguém usando javax.inject defina estereótipos como @ Repository, @ Service, @ Controller marcados como @Qualifier?
ams
Não tenho certeza do que você quer dizer sobre estereótipos. Se você pretende adicionar novas anotações para distinguir entre diferentes instâncias do mesmo tipo, então sim.
sbridges
Por exemplo, em vez de @Named ("maxWaitTime"), você poderia ter @MaxWaitTime. É só um pouco mais limpo.
sourcedelica
28
Belo artigo sobre @Namede @Qualifier java.dzone.com/articles/java-ee6-cdi-named-components
xmedeko
Eu não entendo ... você não pode dizer a diferença entre eles por seus diferentes nomes de variáveis?
CodyBugstein
64

@Injectem vez de Spring @Autowiredpara injetar um feijão.
@Namedem vez de Spring @Componentpara declarar um bean.

Essas anotações padrão JSR-330 são verificadas e recuperadas da mesma maneira que as anotações Spring (contanto que o seguinte jaresteja em seu classpath)

Nadav Finish
fonte
A frase "injetar um bean" é ambígua; você quer dizer "satisfazer todas as dependências desse bean" ou "injetar aquele bean em algo que o possui como dependência"?
Andrew Swan
Onde posso encontrar uma lista de contrapartes JSR para anotações de primavera?
Pawan
injetar um bean - "injetar aquele bean em algo que o tem como uma dependência"
Nadav Finish
Sinto muito, Pawan, não estou familiarizado com uma lista de JSR que correspondem ao Spring Annotation
Nadav Finish
8

Em relação ao nº 2, de acordo com a especificação JSR-330:

Este pacote fornece anotações de injeção de dependência que habilitam classes portáveis, mas deixa a configuração de dependência externa para a implementação do injetor.

Portanto, cabe ao provedor determinar quais objetos estão disponíveis para injeção. No caso da primavera, são todos os feijões da primavera. E qualquer classe anotada com anotações JSR-330 são automaticamente adicionadas como beans Spring ao usar um AnnotationConfigApplicationContext.

sourcedelica
fonte
5

A função principal da anotação @Named é definir um bean com o propósito de resolver instruções EL dentro do aplicativo, geralmente por meio de resolvedores JSF EL. A injeção pode ser realizada usando nomes, mas não era assim que a injeção no CDI deveria funcionar, já que o CDI nos fornece uma maneira muito mais rica de expressar os pontos de injeção e os grãos a serem injetados neles.

abbas
fonte