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.


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.


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)


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.


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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.