2016-11-02 11 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) {//...} 

はその後、私のConfigurationクラスに、私は、Beanを作成していますが、私はコンストラクタでそれをMyServiceClientオブジェクトを渡す必要があり、そしてキャッチは、それが外部のパッケージからだから、私はMyServiceClient Beanを作ることができないということです私はそれを変更することはできません。

@Configuration 
public class MyServiceProxyConfiguration { 

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

だから私がやりたいものを、getMyServiceProxy Beanにautowire /引数を渡すことができることです。現在IntelliJは私にエラーを与えていますクライアントautowireできませんでした。これはどのように達成できますか?次の作品のような

UPDATE

う何か? IntelliJはまだ「autowireできませんでした」というエラーを報告しているためです。ですから、私が注入したい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

メソッドから引数を取り除き、 'return new MyServiceProxyImpl(MyServiceClient.getInstance())'を使うのはどうですか? –

+0

更新されたコードでは、MyServiceClientBuilderに注釈がなく、Springが 'MyServiceClientBuilder'の' @ Bean'注釈を無視するだけなので、 'MyServiceClient'はBeanとして作成されません。しかし、私の答えは似たようなものがあります。あなたはそれをチェックしましたか? –

+0

@BojanTrajkovskiこんにちは、はい、私はあなたが正しいと思います。私はそれを試みるつもりです。ありがとう! – zwiebl

答えて

2

あなたはこのようなあなたの設定ファイルに別のBeanとしてMyServiceClientを定義することができます。

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

私はこのコードをテストしていませんが、それが動作するはずです。

関連する問題