In einer sehr großen Legacy-Anwendung habe ich Schnittstellen und Klassen, die nicht diese Schnittstellen implementieren.Spring: Delegate zu benutzerdefinierten Proxy-Wrapper für die Schnittstelle Injektion
Die Schnittstellen werden basierend auf der Klasse generiert, so dass die Signaturen identisch sind (außer dass die Schnittstelle oben eine weitere Ausnahme hinzufügt) und die Namen ähnlich sind (daher ist es einfach, den Klassennamen aus dem Schnittstellennamen zu finden).
Um eine Implementierung der Schnittstelle zu erhalten, führen wir eine Reihe von Verarbeitungs- und Protokollierungsaufrufen durch, verwenden aber grundsätzlich java.lang.reflect.Proxy
, um an die Klasse zu delegieren. Vereinfachtes sieht es wie folgt aus:
// 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
}
}
Ist es möglich, mit Federanmerkungsverarbeitung, um allgemein @Autowire
alle Felder vom Typ *Interface
und Feder Verwendung MyProxyUtil.getInstance(*Interface.class)
die Umsetzung zu injizieren?
Derart, dass
@Autowire HelloWorldInterface a;
HelloWorldInterface b = MyProxyUtil.getInstance(HelloWorldInterface.class);
@Autowire AnotherInterface c;
AnotherInterface d = MyProxyUtil.getInstance(AnotherInterface.class);
a == b
c == d
Entschuldigung, ich habe Schwierigkeiten herauszufinden, wie Sie das tatsächlich konfigurieren, um verwendet zu werden? Was würde ich meiner applicationContext.xml hinzufügen? –
@caselnelson Sie können einen 'BeanFactoryPostprocessor' verwenden, um den 'AutowireCandidateResolver' zu konfigurieren –
Es gibt ein Problem beim Einbinden der Umgebung in Ihre Lösung -> https: // github.com/mariuszs/env-is-null – MariuszS