Ich möchte eine Singleton-Objektabhängigkeit zu einer Spring Bean injizieren. Der Haken ist, dass ich nicht auf die Klasse zugreifen und sie ändern kann, deren Objekt ich injizieren möchte. Lassen Sie mich das Beispiel beschreiben.Injection Abhängigkeit zu einer Spring Bean
So habe ich meine Schnittstelle, und die Implementierung dieser Schnittstelle, wie folgt.
public interface MyServiceProxy {
String BEAN_NAME = "MyServiceProxy";
Data getData(String dataId);
}
public class MyServiceProxyImpl implements MyServiceProxy {
private final MyServiceClient client;
public MyServiceProxyImpl(MyServiceClient client) {
this.client = client;
}
@Override
public Data getData(String dataId) {//...}
Dann in meiner Konfiguration Klasse, ich schaffe eine Bohne, aber ich brauche es das MyServiceClient
Objekt im Konstruktor übergeben, und der Haken ist, dass ich nicht MyServiceClient
eine Bohne machen kann, weil sie von einem externen Paket ist und ich kann es nicht ändern.
@Configuration
public class MyServiceProxyConfiguration {
@Bean(name = MyServiceProxy.BEAN_NAME)
public MyServiceProxy getMyServiceProxy(MyServiceClient client) { // could not autowire client
return new MyServiceProxyImpl(client);
}
}
Also, was ich möchte, tun, ist in der Lage zu sein, ein Argument zu getMyServiceProxy
Bean Bestanden/autowire. Zur Zeit gibt IntelliJ mir einen Fehler Konnte Client nicht autirieren. Wie kann dies erreicht werden?
UPDATE
wäre so etwas wie die folgende Arbeit? Weil IntelliJ immer noch einen "can not autowire" -Fehler meldet. Wenn ich also eine Bean-Methode erstellt habe, die die client
-Information zurückgibt, die ich injizieren möchte, und dann @Inject-Annotation zu der Methode hinzufüge, in die ich sie injizieren möchte. arbeiten
@Configuration
public class MyServiceProxyConfiguration {
@Bean
public MyServiceClient getMyServiceClient() {
return MyServiceClient.getInstance(); //initiate MyServiceClient
}
@Bean(name = MyServiceProxy.BEAN_NAME)
public MyServiceProxy getMyServiceProxy(MyServiceClient client) {
return new MyServiceProxyImpl(client);
}
}
ich diesen Code nicht getestet, aber es sollte:
public class MyServiceClientBuilder {
private final ClientBuilder builder;
public MyServiceClientBuilder(ClientBuilder builder) {
this.builder = builder;
}
@Bean
public MyServiceClient build() {
return builder.newClient();
}
@Configuration
public class MyServiceProxyConfiguration {
@Inject
@Bean(name = MyServiceProxy.BEAN_NAME)
public MyServiceProxy getMyServiceProxy(MyServiceClient client) { // could not autowire client
return new MyServiceProxyImpl(client);
}
}
Wie wäre es mit dem Entfernen des Arguments aus der Methode und mit 'return new MyServiceProxyImpl (MyServiceClient.getInstance())'? –
In Ihrem aktualisierten Code wurde 'MyServiceClient' nicht als Bean erstellt, da MyServiceClientBuilder keine Annotation hat und Spring diese' @ Bean' Annotation einfach in 'MyServiceClientBuilder' ignoriert. Aber etwas ähnliches wird in meiner Antwort getan, hast du es überprüft? –
@BojanTrajkovski Hallo, ja, ich habe, ich denke du hast Recht. Ich werde es versuchen. Vielen Dank! – zwiebl