2016-11-02 174 views
0

我想爲Spring bean注入一個單例對象依賴項。問題在於我無法訪問和修改要注入其對象的類。讓我來描述一下這個例子。向Spring bean注入依賴關係

所以我有我的接口,並執行這個接口,如下所示。

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) {//...} 
在我的配置類

然後,我創建一個豆,但我需要它傳遞MyServiceClient對象在構造函數中,而美中不足的是,我不能讓MyServiceClient豆,因爲它從外部包的我無法修改它。

@Configuration 
public class MyServiceProxyConfiguration { 

    @Bean(name = MyServiceProxy.BEAN_NAME) 
    public MyServiceProxy getMyServiceProxy(MyServiceClient client) { // could not autowire client 
     return new MyServiceProxyImpl(client); 
    } 
} 

所以我想幹什麼,是能夠通過/自動裝配的參數getMyServiceProxy豆。目前IntelliJ給我一個錯誤無法自動連接客戶端。這怎麼能實現?

UPDATE

會像下面這樣的工作?因爲IntelliJ仍在報告「無法自動裝載」錯誤。所以如果我創建了一個返回我想注入的client的bean方法,然後將@Inject註釋添加到我希望注入的方法中。

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

如何從方法中刪除參數,並使用'返回new MyServiceProxyImpl(MyServiceClient.getInstance())'? –

+0

在您的更新代碼中,MyServiceClient不會被創建爲Bean,因爲MyServiceClientBuilder沒有註釋,Spring將忽略'MyServiceClientBuilder'中的'@ Bean'註釋。但是在我的回答中做了類似的事情,你有沒有檢查過它? –

+0

@BojanTrajkovski嗨,是的,我有,我認爲你是對的。我會去嘗試一下。謝謝! – zwiebl

回答

2

可以定義爲MyServiceClient在配置文件中一個單獨的bean是這樣的:

@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); 
    } 
} 

我還沒有測試此代碼,但它應該工作。