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.