Primavera:L'iniezione di un privato interno della classe come una classe esterna del membro?
-
23-09-2019 - |
Domanda
Ho la seguente struttura di classe
public class Outer{
private Mapper a;
....
private class MapperA implements Mapper {
}
private class MapperB implements Mapper {
}
}
Nella mia Primavera del file di configurazione vorrei creare un Esterno bean, e assegnare un MapperA o MapperB come una proprietà.È possibile questo?
<bean id="outer" class="mypackage.Outer">
<property name="a" ?????='????' />
</bean>
Edit:Qualche info in più, sulla base del feedback da risposte:
Ho ottenuto pigro con il mio esempio di cui sopra.Ho un pubblico setter/getter per il Mapper variabile di istanza.
La ragione per cui il Mapper classi sono classi interne è perché ci potrebbero essere potenzialmente molti di loro, e saranno sempre e solo essere utilizzato in questa classe.Non voglio solo una tonnellata di spazzatura classi nel mio progetto.Forse un metodo factory è un'idea migliore.
Soluzione
Normalmente avresti bisogno di un setter per il Mapper
all'interno Outer
, e un'istanza di richiesta Mapper
.Ma come sono questi:
- privato
- interiore
le classi, che diventa un po ' complicato (come hai identificato).Se si fanno loro pubblico, sono sicuro che si potrebbe creae un esempio utilizzando Outer$MapperA
ecc.Ma che sembra un po ' brutto.Così:
- hanno bisogno di essere interiore e privato ?
- forse Esterno può prendere una Stringa, e di stabilire che, sia per creare un'istanza di
MapperA
oMapperB
.cioèc'è qualche possibilità della fabbrica qui.
La cosa più semplice da fare è davvero determinare se hanno bisogno di essere interno/privato.Se è così, allora davvero non dovrebbe essere fatto riferimento nella config che dovremmo parlare pubblicamente accessibili le classi.
Altri suggerimenti
Primavera può istanziare le classi interne private
. Il problema reale al vostro config è che essi sono anche non static
, quindi è necessario un <constructor-arg .../>
:
<bean id="outer" class="mypackage.Outer">
<property name = "a">
<bean class = "mypackage.Outer.MapperA">
<constructor-arg ref = "outer" />
</bean>
</property>
</bean>
Per quanto ne so, è impossibile fino a quando si effettua MapperA
e MapperB
solite classi pubbliche.
Ma se si vuole tenerli come lezioni private interne allora si può "iniettare" manualmente.
È necessario creare il metodo con @PostInit
annotazione e inizializzare il campo a
lì (a = new MapperA ()
per esempio, o qualcosa di più complesso). Con questo approccio si dovrebbe anche verificare che le richiamate inizializzazione vengono commutati-on nella configurazione primavera.