向Spring bean注入依赖项

时间:2016-11-02 22:41:42

标签: java spring spring-mvc dependency-injection

我想向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。目前IntelliJ给我一个错误无法自动装配客户端。如何实现这一目标?

更新

以下情况会怎样?因为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);
    }
}

1 个答案:

答案 0 :(得分: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);
    }
}

我没有测试过这段代码,但它应该可以运行。