2016-10-06 4 views
3

XML Anmerkung Verwendung, ich bin eine Karte Injektion des unter config -Frühling Annotations - Injizieren Karte von Objekten

<bean id = "customerfactory" class = "com.brightstar.CustomerFactory"> 
     <property name = "getCustomerMap"> 
      <map key-type = "java.lang.String" value-type = "com.brightstar.CustomerImpl"> 
       <entry key = "DEFAULT" value-ref = "getDefaultImpl"></entry> 
       <entry key = "PERSON" value-ref = "getPersonImpl"></entry> 
       <entry key = "COMPANY" value-ref = "getCompanyImpl"></entry> 
      </map> 
     </property> 
    </bean> 

Ich habe 3 Bohnen erstellt - DefaultImpl, PersonImpl und CompanyImpl. Wie kann ich diese als Map mit Spring Annotation injizieren?

EDIT: Vorerst habe ich die folgenden, aber nicht sicher durchgeführt, wenn es der empfohlene Ansatz ist

private Map<String, CustomerImpl> getCustomerMap ; 
@Autowired 
private GetDefaultImpl getDefaultImpl; 
@Autowired 
private GetPersonImpl getPersonImpl; 
@Autowired 
private GetCompanyImpl getCompanyImpl; 

private static final String DEFAULT = "DEFAULT"; 
private static final String COM = "PERSON"; 
private static final String SOM = "COMPANY"; 


@PostConstruct 
public void init(){ 
    getCustomerMap = new LinkedHashMap<String,CustomerImpl>(); 
    getCustomerMap.put(DEFAULT, getDefaultImpl); 
    getCustomerMap.put(PERSON, getPersonImpl); 
    getCustomerMap.put(COMPANY, getCompanyImpl);   
} 

Antwort

4

1.Inject ein Karte, die Objekte (mit Java Config)

enthält

Sie mögen dies tun können ...

@Configuration 
public class MyConfiguration { 
    @Autowired private WhiteColourHandler whiteColourHandler; 

    @Bean public Map<ColourEnum, ColourHandler> colourHandlers() { 
     Map<ColourEnum, ColourHandler> map = new EnumMap<>(); 
     map.put(WHITE, whiteColourHandler); 
     //put more objects into this map here 
     return map; 
    } 
} 

====================

2.Inject ein Karte, die enthält Strings (Mit Properties-Datei)

können Sie String-Werte in eine Karte injizieren von den Eigenschaften mit der @Value Annotation und Spel Datei so was.

Zum Beispiel unter Eigenschaft in der Eigenschaftendatei.

propertyname={key1:'value1',key2:'value2',....} 

in Ihrem Code

@Value("#{${propertyname}}") 
private Map<String,String> propertyname; 

Hinweis: 1.Die Hashtag als Teil der Anmerkung.

2.Values must be quotes, else you will get SpelEvaluationException 
+0

Vielen Dank. In meinem Fall muss ich Objekte injizieren, die nicht in der Eigenschaftendatei vorhanden sein können. –

+0

Danke, das hilft. Kannst du bitte auch meinen Ansatz kommentieren? Ich werde die Antwort akzeptieren. –

+0

Ich bin mir nicht sicher, @Postconstruct ist die beste Methode, Bean zu initialisieren oder den Lebenszyklus von Bean zu verwalten, da es JEE-Standard ist, aber keine Abhängigkeiten injiziert. Aber, Ja, Best Practices sind keine Regeln. –

1

Nur meine 2 Cent hinzufügen. Soweit ich verstanden habe, implementieren Sie ein Factory-Muster und wechseln zur Laufzeit zwischen den Implementierungen. Also, es ist Code, keine Konfiguration, idealer Ort, um darin zu sein, ist der Code selbst, nicht die Eigenschaftendatei. Ich würde mit dem ersten Ansatz gehen, den Sundararaj Govindasamy vorgeschlagen hat. Ich sehe auch kein Problem in der @postConstruct-Methode. Aber ich würde mit ersterem als sauberer gehen.

+0

Vielen Dank für Ihre Eingaben! –

Verwandte Themen