डिफ़ॉल्ट रूप से, @Component के साथ एनोटेट किए गए बीन्स को पहले अक्षर लोअर-केस के साथ शॉर्ट क्लास नाम के माध्यम से हल किया जा सकता है, उदा। class x.y.z.Foo -> "foo". यदि हमारे पास एक ही इंटरफ़ेस को लागू करने वाले एक से अधिक बीन हैं, तो इंजेक्टेड बीन को @Qualifier एनोटेशन जैसे @Qualifier("foo") के माध्यम से निर्दिष्ट किया जाना चाहिए।

हालांकि, रिफैक्टरिंग पर, बीन का नाम Foo से Bar कर दिया जा सकता है और @Qualifier के अंदर के सभी संदर्भों का नाम बदलकर @Qualifier("foo") से @Qualifier("bar") कर दिया जाना चाहिए, अन्यथा, हमें रनटाइम पर एक त्रुटि मिलती है।

रनटाइम से पहले ऐसी बीन्स की खोज को सुविधाजनक बनाने का कोई तरीका है, या कम से कम, संकलन-समय त्रुटि या चेतावनी प्राप्त करें?

अब मैं जो सबसे अच्छा तरीका देखता हूं वह एक रजिस्ट्री वर्ग बना रहा है और सभी बीन नाम वहां रख रहा है:

public final class BeanNames {
     public static final String FOO = "foo";
     ...
}

@Component(BeanNames.FOO)
class Foo { ... }

class Baz {
   @Autowired
   @Qualifier(BeanNames.FOO)
   Foo foo;
   ...
1
Dzmitry Bahdanovich 4 पद 2018, 18:48

1 उत्तर

सबसे बढ़िया उत्तर

आप एक कस्टम क्वालिफायर एनोटेशन बना सकते हैं जो मानक @Qualifier पर बनता है:

@Target({ElementType.CONSTRUCTOR, ElementType.FIELD,
         ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Qualifier
public @interface QualifierFoo {}

फिर इसके साथ अपने घटक वर्ग को एनोटेट करें:

@Component
@QualifierFoo
class Foo { ... }

और इसे क्वालीफायर के साथ किसी भी अन्य बीन की तरह इंजेक्ट करें:

class Baz {
   @Autowired
   @QualifierFoo
   Foo foo;
   ...

फिर जब आप Foo से Bar को रिफैक्टर करते हैं, तो आपको केवल QualifierFoo से QualifierBar तक क्वालीफायर नाम को रिफैक्टर करना होगा।

0
dyslexit 5 पद 2018, 18:48