Primavera:L'iniezione di un privato interno della classe come una classe esterna del membro?

StackOverflow https://stackoverflow.com/questions/2344463

  •  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:

  1. Ho ottenuto pigro con il mio esempio di cui sopra.Ho un pubblico setter/getter per il Mapper variabile di istanza.

  2. 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.

È stato utile?

Soluzione

Normalmente avresti bisogno di un setter per il Mapper all'interno Outer, e un'istanza di richiesta Mapper.Ma come sono questi:

  1. privato
  2. 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ì:

  1. hanno bisogno di essere interiore e privato ?
  2. forse Esterno può prendere una Stringa, e di stabilire che, sia per creare un'istanza di MapperA o MapperB.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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top