Untuk apa javax.inject.Named annotation seharusnya digunakan?

114

Saya mencoba untuk memahami javax.injectpaket dan saya tidak jelas untuk apa javax.inject.Namedanotasi itu digunakan. Javadoc tidak menjelaskan ide di baliknya.

Javadoc ada di http://download.oracle.com/javaee/6/api/javax/inject/Named.html

Saya menggunakan Spring 3.0 untuk menulis beberapa program sampel, dengan meletakkan @Namedkacang tampaknya menambahkannya ke pabrik kacang tetapi deskripsi Javadoc sangat ringan sehingga saya tidak tahu apakah itu perilaku standar atau perilaku khusus Spring.

Pertanyaan saya adalah:

  1. Apa perbedaan antara @Nameddan@Qualifier
  2. Bagaimana Anda bisa memberi tahu sistem Runtime bahwa sebuah kelas harus dapat diinjeksi di kelas lain apa anotasi untuk itu? Setara dengan @Componentdi Spring?

Perbarui 1 ada penjelasan yang sangat baik tentang @Nameddan @Qualifierdi artikel Bagus tentang @Nameddan @Qualifier https://dzone.com/articles/java-ee6-cdi-named-components terima kasih @xmedeko untuk menautkan ke komentar di bawah.

ams
sumber
Konfigurasi JSR-330 berada di luar spesifikasi, yaitu khusus penampung.
Thorbjørn Ravn Andersen
1
Menurut dokumen Spring, "Anotasi @Named JSR 330 dapat digunakan sebagai sarana untuk mendeteksi komponen dan memberinya nama. Perilaku ini diaktifkan secara otomatis jika Anda memiliki JSR 330 JAR di classpath". apakah perilaku ini unik untuk spring atau untuk semua container yang memahami @Named?
pagi

Jawaban:

87

Gunakan @Nameduntuk membedakan objek berbeda dari tipe yang sama terikat dalam lingkup yang sama.

@Named("maxWaitTime")
public long maxWaitTimeMs;

@Named("minWaitTime")
public long minWaitTimeMs;

Tanpa @Namedkualifikasi, injektor tidak akan tahu panjang mana yang harus diikat ke variabel mana.

  • Jika Anda ingin membuat anotasi yang bertindak seperti itu @Named, gunakan @Qualifieranotasi saat membuatnya.

  • Jika Anda lihat @Named, itu sendiri dianotasi dengan @Qualifier.

jembatan
sumber
Jadi @Named sebenarnya adalah @Qualifier, jadi mengapa @Qualifier harus begitu umum, apakah idenya adalah mengizinkan seseorang yang menggunakan javax.inject untuk mendefinisikan stereotip seperti @ Repository, @ Service, @ Controller yang ditandai sebagai @Qualifier?
pagi
Saya tidak yakin apa yang Anda maksud tentang stereotip. Jika Anda bermaksud menambahkan anotasi baru untuk membedakan contoh berbeda dari Jenis yang sama, maka ya.
sbridges
Misalnya, alih-alih @Named ("maxWaitTime"), Anda dapat memiliki @MaxWaitTime. Ini hanya sedikit lebih bersih.
sourcecedelica
28
Artikel bagus tentang @Nameddan @Qualifier java.dzone.com/articles/java-ee6-cdi-named-components
xmedeko
Saya tidak mengerti ... tidak bisakah Anda membedakan mereka dengan nama variabel yang berbeda?
CodyBugstein
64

@Injectbukannya Spring @Autowireduntuk menyuntikkan kacang.
@Namedbukannya Spring @Componentuntuk mendeklarasikan bean.

Mereka JSR-330 penjelasan standar-scan dan diambil dengan cara yang sama seperti musim semi penjelasan (selama berikut ini jaradalah di classpath Anda)

Nadav Selesai
sumber
Frasa "menyuntikkan kacang" bersifat ambigu; maksud Anda "memenuhi semua ketergantungan kacang itu" atau maksud Anda "menyuntikkan kacang itu ke dalam sesuatu yang memilikinya sebagai ketergantungan"?
Andrew Swan
Di mana saya dapat menemukan daftar mitra JSR untuk anotasi pegas?
Pawan
menyuntikkan kacang - "menyuntikkan kacang itu ke dalam sesuatu yang memiliki ketergantungan"
Nadav Selesai
Maafkan saya Pawan, saya tidak begitu paham dengan daftar JSR yang setara dengan anotasi pegas
Nadav Selesai
8

Mengenai # 2, menurut spesifikasi JSR-330:

Paket ini menyediakan anotasi injeksi ketergantungan yang mengaktifkan kelas portabel, tetapi menyerahkan konfigurasi ketergantungan eksternal pada implementasi injektor.

Jadi terserah penyedia untuk menentukan objek mana yang tersedia untuk injeksi. Dalam kasus Spring, semuanya adalah Spring beans. Dan semua kelas yang dianotasi dengan anotasi JSR-330 secara otomatis ditambahkan sebagai kacang Spring saat menggunakan AnnotationConfigApplicationContext.

sourcedelica.dll
sumber
5

Peran utama anotasi @Named adalah untuk mendefinisikan kacang untuk tujuan menyelesaikan pernyataan EL dalam aplikasi, biasanya melalui resolver JSF EL. Injeksi dapat dilakukan dengan menggunakan nama tetapi ini bukanlah cara kerja injeksi dalam CDI karena CDI memberi kita cara yang lebih kaya untuk mengekspresikan titik injeksi dan biji yang akan disuntikkan ke dalamnya.

abbas
sumber