javax.inject.Named คำอธิบายประกอบควรจะใช้สำหรับอะไร


114

ฉันพยายามทำความเข้าใจกับjavax.injectแพ็คเกจและไม่ชัดเจนว่าjavax.inject.Namedควรใช้คำอธิบายประกอบอะไร Javadoc ไม่ได้อธิบายถึงแนวคิดเบื้องหลัง

Javadoc อยู่ที่http://download.oracle.com/javaee/6/api/javax/inject/Named.html

ฉันใช้Spring 3.0เพื่อเขียนโปรแกรมตัวอย่างโดยการใส่@Namedbean ดูเหมือนว่าจะเพิ่มลงในโรงงานถั่ว แต่คำอธิบาย Javadoc นั้นเบามากฉันไม่สามารถบอกได้ว่านั่นเป็นพฤติกรรมมาตรฐานหรือพฤติกรรมเฉพาะของ Spring

คำถามของฉันคือ:

  1. อะไรคือความแตกต่างระหว่าง@Namedและ@Qualifier
  2. คุณควรจะบอกระบบ Runtime ได้อย่างไรว่าคลาสควรฉีดในคลาสอื่น ๆ คำอธิบายประกอบสำหรับสิ่งนั้นคืออะไร? เทียบเท่า@Componentในฤดูใบไม้ผลิ?

อัปเดต 1มีคำอธิบายที่ยอดเยี่ยม@Namedและ@Qualifierที่ Nice article about @Namedและ@Qualifier https://dzone.com/articles/java-ee6-cdi-named-componentsขอบคุณ @xmedeko สำหรับการเชื่อมโยงไปยังความคิดเห็นด้านล่าง


การกำหนดค่าของ JSR-330 อยู่นอกข้อมูลจำเพาะเช่นคอนเทนเนอร์เฉพาะ
Thorbjørn Ravn Andersen

1
ตามเอกสาร Spring "คำอธิบายประกอบ @Named ของ JSR 330 สามารถใช้เป็นเครื่องมือในการตรวจจับส่วนประกอบและตั้งชื่อได้การทำงานนี้จะเปิดใช้งานโดยอัตโนมัติหากคุณมี JSR 330 JAR บนพา ธ คลาส" พฤติกรรมนี้เป็นลักษณะเฉพาะสำหรับสปริงหรือคอนเทนเนอร์ทั้งหมดที่เข้าใจ @Named หรือไม่
AMS

คำตอบ:


87

ใช้@Namedเพื่อแยกความแตกต่างระหว่างอ็อบเจ็กต์ประเภทเดียวกันที่อยู่ในขอบเขตเดียวกัน

@Named("maxWaitTime")
public long maxWaitTimeMs;

@Named("minWaitTime")
public long minWaitTimeMs;

หากไม่มี@Namedคุณสมบัติผู้ฉีดจะไม่ทราบว่าต้องผูกกับตัวแปรใดนานเท่าใด

  • หากคุณต้องการสร้างคำอธิบายประกอบที่มีลักษณะเหมือน@Namedให้ใช้@Qualifierคำอธิบายประกอบเมื่อสร้าง

  • ถ้าคุณดูที่มันเป็นที่ตัวเองกำกับด้วย@Named@Qualifier


ดังนั้น @Named คือ @Qualifier ดังนั้นทำไม @Qualifier จึงต้องเป็นแบบทั่วไปจึงมีความคิดที่จะอนุญาตให้คนที่ใช้ javax.inject กำหนดแบบแผนเช่น @ Repository, @ Service, @ Controller ที่มาร์กอัปเป็น @Qualifier
AMS

ฉันไม่แน่ใจว่าคุณหมายถึงอะไรเกี่ยวกับแบบแผน หากคุณหมายถึงการเพิ่มคำอธิบายประกอบใหม่เพื่อแยกความแตกต่างระหว่างอินสแตนซ์ประเภทเดียวกันที่แตกต่างกันใช่
สะพานลอย

ตัวอย่างเช่นแทนที่จะเป็น @Named ("maxWaitTime") คุณอาจมี @MaxWaitTime แค่ทำความสะอาดเล็กน้อย
sourcedelica

28
บทความดีๆเกี่ยวกับ@Namedและ@Qualifier java.dzone.com/articles/java-ee6-cdi-named-components
xmedeko

ฉันไม่เข้าใจ ... คุณไม่สามารถบอกความแตกต่างระหว่างพวกเขาด้วยชื่อตัวแปรที่แตกต่างกันได้หรือไม่?
CodyBugstein

64

@Injectแทนที่จะ@Autowiredฉีดสปริงเพื่อฉีดถั่ว
@Namedแทนที่จะเป็นฤดูใบไม้ผลิ@Componentเพื่อประกาศถั่ว

ผู้JSR-330คำอธิบายประกอบมาตรฐานจะถูกสแกนและเรียกลักษณะเดียวกับฤดูใบไม้ผลิคำอธิบายประกอบ (ตราบเท่าที่ต่อไปนี้jarอยู่ใน classpath ของคุณ)


วลี "ฉีดถั่ว" มีความคลุมเครือ คุณหมายถึง "ตอบสนองการพึ่งพาของถั่วทั้งหมด" หรือคุณหมายถึง "ฉีดถั่วนั้นลงในสิ่งที่มีมันเป็นที่พึ่งพา"?
Andrew Swan

ฉันจะดูรายชื่อคู่สัญญา JSR กับคำอธิบายประกอบแบบสปริงได้ที่ไหน
Pawan

ฉีดถั่ว - "ฉีดถั่วนั้นลงในสิ่งที่มีมันเป็นที่พึ่ง"
Nadav เสร็จสิ้น

ฉันขอโทษ Pawan ฉันไม่คุ้นเคยกับรายชื่อ JSR ที่เป็นคู่หูกับคำอธิบายประกอบในฤดูใบไม้ผลิ
Nadav เสร็จสิ้น

8

เกี่ยวกับ # 2 ตามข้อมูลจำเพาะ JSR-330:

แพคเกจนี้มีคำอธิบายประกอบการฉีดพึ่งพาที่เปิดใช้งานคลาสแบบพกพา แต่จะปล่อยการกำหนดค่าการพึ่งพาภายนอกไว้จนถึงการใช้งานหัวฉีด

ดังนั้นจึงขึ้นอยู่กับผู้ให้บริการที่จะพิจารณาว่าวัตถุใดที่สามารถฉีดได้ ในกรณีของ Spring ก็คือ Spring beans ทั้งหมด และคลาสใด ๆ ที่มีคำอธิบายประกอบ JSR-330 จะถูกเพิ่มโดยอัตโนมัติเป็น Spring beans เมื่อใช้ AnnotationConfigApplicationContext


5

บทบาทหลักของคำอธิบายประกอบ @Named คือการกำหนด bean เพื่อจุดประสงค์ในการแก้ไขคำสั่ง EL ภายในแอปพลิเคชันโดยปกติจะใช้ตัวแก้ไข JSF EL การฉีดสามารถทำได้โดยใช้ชื่อ แต่นี่ไม่ใช่วิธีที่การฉีดใน CDI มีขึ้นเพื่อให้ได้ผลเนื่องจาก CDI ช่วยให้เรามีวิธีที่ดีกว่ามากในการแสดงจุดฉีดและถั่วที่จะฉีดเข้าไป

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.