【问题标题】:Injecting dependency to a Spring bean将依赖项注入到 Spring bean
【发布时间】: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


【解决方案1】:

您可以像这样在配置文件中将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);
    }
}

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-14
    • 2012-08-02
    • 1970-01-01
    • 2011-06-12
    • 1970-01-01
    • 1970-01-01
    • 2014-06-28
    • 2012-05-22
    相关资源
    最近更新 更多