Affrontiamo questo problema nel nostro progetto e lo risolviamo attraverso una classe simile a quella di fabbrica. La classe di client -la uno che aveva bisogno il fagiolo a runtime- aveva un'istanza della fabbrica, che è stato iniettato attraverso Primavera:
@Component
public class ImTheClient{
@Autowired
private ImTheFactory factory;
public void doSomething(
Parameters parameters) throws Exception{
IWantThis theInstance = factory.getInstance(parameters);
}
}
Così, l'istanza IWantThis
dipende dal valore di runtime del parametro parameters
. L'implementazione di fabbrica va come questa:
@Component
public class ImTheFactoryImpl implements
ImTheFactory {
@Autowired
private IWantThisBadly anInstance;
@Autowired
private IAlsoWantThis anotherInstance;
@Override
public IWantThis getInstance(Parameters parameters) {
if (parameters.equals(Parameters.THIS)) {
return anInstance;
}
if (parameters.equals(Parameters.THAT)) {
return anotherInstance;
}
return null;
}
}
Così, l'istanza di fabbrica detiene riferimento sia dei valori posible della classe IWantThis
, essendo IWantThisBadly
e IAlsoWantThis
entrambe le implementazioni di IWantThis
.
fonte
2013-07-17 15:22:09
Una soluzione suggerita da un collega che era '@Autowired Map' popolerà con ID di fagioli come la chiave - forse che potrebbe essere la soluzione meno-peggio. –
Dai un'occhiata al post simile. http://stackoverflow.com/a/24525715/3796723 – linusdsunil