Spring autowire ตามชื่ออย่างไรเมื่อพบถั่วที่ตรงกันมากกว่าหนึ่งรายการ


107

สมมติว่าฉันมีอินเทอร์เฟซเช่นนี้:

interface Country {}
class USA implements Country {}
class UK implements Country ()

และตัวอย่างของการกำหนดค่า xml นี้:

<bean class="USA"/>
<bean id="country" class="UK"/>
<bean id="main" class="Main"/>

ฉันจะควบคุมการขึ้นต่อกันอัตโนมัติด้านล่างได้อย่างไร ฉันต้องการสหราชอาณาจักร

class Main {
    private Country country;
    @Autowired
    public void setCountry(Country country) {
        this.country = country;
    }
}

ฉันใช้ Spring 3.0.3.RELEASE


ฉันคิดว่าฉันจะเพิ่มว่าฉันได้รับ "ถั่วชนิดไม่ซ้ำใคร ... " ในสภาพแวดล้อม (การทดสอบ) เดียวและทำงานได้ดีในสภาพแวดล้อมการพัฒนาของฉัน ฉันแน่ใจว่ามันเป็นคลาสพา ธ บางอย่าง แต่ปรากฎว่าถ้าคุณเพิ่ม @Qualifier มันก็ใช้ได้ดี
markthegrea

คำตอบ:


113

เอกสารนี้อยู่ในส่วน 3.9.3ของคู่มือ Spring 3.0:

สำหรับการจับคู่ทางเลือกชื่อ bean ถือเป็นค่าคุณสมบัติเริ่มต้น

กล่าวอีกนัยหนึ่งพฤติกรรมเริ่มต้นเหมือนกับว่าคุณได้เพิ่มลง@Qualifier("country")ในเมธอด setter


เมื่อคุณพูดว่า "ชื่อถั่ว" คุณหมายถึงชื่อของช่องที่มีถั่วหรือไม่ (เช่นในกรณีนี้country)
คดีของ Fund Monica

67

คุณสามารถใช้คำอธิบายประกอบ @Qualifier

จากที่นี่

การปรับแต่งอัตโนมัติตามคำอธิบายประกอบพร้อมคุณสมบัติ

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

class Main {
    private Country country;
    @Autowired
    @Qualifier("country")
    public void setCountry(Country country) {
        this.country = country;
    }
}

สิ่งนี้จะใช้ในสหราชอาณาจักรเพิ่ม id ไปยัง USA bean และใช้ถ้าคุณต้องการ USA


12

อีกวิธีหนึ่งในการบรรลุผลลัพธ์เดียวกันคือการใช้คำอธิบายประกอบ @Value:

public class Main {
     private Country country;

     @Autowired
     public void setCountry(@Value("#{country}") Country country) {
          this.country = country;
     }
}

ในกรณีนี้"#{country}สตริงเป็นฤดูใบไม้ผลิการแสดงออกภาษา (เกม)countryการแสดงออกซึ่งประเมินถั่วที่มีชื่อว่า


ฉีดตามคุณสมบัติได้ไหม จะเกิดอะไรขึ้นถ้า USA หรือ UK เป็นพารามิเตอร์บางประเภทที่มาจาก URL และฉันต้องการฉีด 2 สิ่งที่แตกต่างกันโดยอิงจากพารามิเตอร์คืออะไร
Kalpesh Soni

6

อีกหนึ่งวิธีแก้ปัญหาตามชื่อ:

@Resource(name="country")

มันใช้แพ็คเกจjavax.annotationดังนั้นจึงไม่ใช่ Spring เฉพาะ แต่ Spring รองรับ


1
แต่@Resourceจะไม่อยู่ที่นั่นพร้อมกับ java 11 เนื่องจากโมดูลจิ๊กซอว์
Dirk Hoffmann

5

ในบางกรณีคุณสามารถใช้คำอธิบายประกอบ @Primary

@Primary
class USA implements Country {}

วิธีนี้จะถูกเลือกให้เป็นผู้สมัครรับเลือกตั้งอัตโนมัติเริ่มต้นโดยไม่จำเป็นต้องกำหนดเส้นทางผู้สมัครอัตโนมัติบนถั่วอื่น

สำหรับ mo deatils ให้ดูที่Autowiring two beans ที่ใช้อินเทอร์เฟซเดียวกัน - จะตั้งค่าเริ่มต้น bean ให้ autowire ได้อย่างไร?

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