In un'applicazione legacy molto grande, ho interfacce e classi che fanno non implementare tali interfacce.Spring: Delega a un wrapper proxy personalizzato per l'iniezione dell'interfaccia
Le interfacce vengono generate in base alla classe in modo che le firme siano uguali (tranne che l'interfaccia aggiunge un'altra eccezione in alto) ei nomi sono simili (quindi è facile trovare il nome della classe dal nome dell'interfaccia).
Per ottenere un'implementazione dell'interfaccia, eseguiamo una serie di chiamate di elaborazione e registrazione, ma fondamentalmente utilizziamo java.lang.reflect.Proxy
per delegare alla classe. Semplificata sembra che questo:
// This will create a proxy and invoke handler that calls HelloWorld.doSomething
HelloWorldInterface i = MyProxyUtil.getInstance(HelloWorldInterface.class);
i.doSomething();
public interface HelloWorldInterface {
public void doSomething() throws Exception;
}
public class HelloWorld {
public void doSomething() {
//something
}
}
E 'possibile con l'elaborazione di primavera annotazione, genericamente @Autowire
tutti i campi di tipo *Interface
e usufruire primavera MyProxyUtil.getInstance(*Interface.class)
per iniettare l'attuazione?
Tale che
@Autowire HelloWorldInterface a;
HelloWorldInterface b = MyProxyUtil.getInstance(HelloWorldInterface.class);
@Autowire AnotherInterface c;
AnotherInterface d = MyProxyUtil.getInstance(AnotherInterface.class);
a == b
c == d
Scusa, ho difficoltà a capire come si configura effettivamente questo per essere utilizzato? Cosa aggiungerei al mio applicationContext.xml? –
@casenelson puoi usare un 'BeanFactoryPostprocessor' per configurare' AutowireCandidateResolver' –
C'è un problema con l'iniezione di Environment con la tua soluzione -> https: // github.com/mariuszs/env-is-null – MariuszS