【发布时间】:2016-11-02 22:41:41
【问题描述】:
我想向 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);
}
}
【问题讨论】:
-
如何从方法中删除参数,并使用
return new MyServiceProxyImpl(MyServiceClient.getInstance())? -
在您更新的代码中,
MyServiceClient不会被创建为 Bean,因为 MyServiceClientBuilder 没有注释,Spring 将忽略MyServiceClientBuilder中的@Bean注释。但是我的回答中做了类似的事情,你检查了吗? -
@BojanTrajkovski 嗨,是的,我有,我认为你是对的。我要试试。谢谢!
标签: java spring spring-mvc dependency-injection