2016-11-02 2 views
0

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); 
    } 
} 
+0

Wie wäre es mit dem Entfernen des Arguments aus der Methode und mit 'return new MyServiceProxyImpl (MyServiceClient.getInstance())'? –

+0

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? –

+0

@BojanTrajkovski Hallo, ja, ich habe, ich denke du hast Recht. Ich werde es versuchen. Vielen Dank! – zwiebl

Antwort

2

Sie können in der Konfigurationsdatei wie diese MyServiceClient als separate Bohne definieren.