Java Guice 命名绑定与其他模块提供的对象

Java Guice Named Bindings with Objects provided from other modules

这是我当前的设置

Class 文件

public class ToyAdapter {

private final ToyClient toyClient;
private final Retryer retryer;

    @Inject
    public APIAdapter(final ToyClient toyClient,
                        @Named("toyRetryer") final Retryer retryer) {
        this.toyClient = toyClient;
        this.retryer = retryer;
    }

向导文件
我有几个 guice 模块,但这个属于上述 class

public class ToyModule extends AbstractModule {

    @Override
    protected void configure() {

        bind(ToyAdapter.class).in(Singleton.class);
        bind(Retryer.class).annotatedWith(Names.named("toyRetryer")).toInstance(getToyRetryer());
    }

    @Provides
    @Singleton
    public ToyClient getToyClient(...){
       ...
    }

    private Retryer getToyRetryer() {#Takes no arguments
        return RetryerBuilder...build();
    }
}

到目前为止效果很好!但是,现在我的重试器需要另一个模块中提供的 LogPublisher 对象。

我在努力

public class ToyModule extends AbstractModule {

    LogPublisher logPublisher;

    @Override
    protected void configure() {
        requestInjection(logPublisher);
        bind(ToyAdapter.class).in(Singleton.class);
        bind(Retryer.class).annotatedWith(Names.named("toyRetryer")).toInstance(getToyRetryer());
    }
    
    private Retryer getToyRetryer() {
        return RetryerBuilder.withLogPublisher(logPublisher).build();
    }
}

LogPublisher 在另一个 guice 模块中提供,该模块有很多其他对象依赖于 LogPublisher,所以我不想将所有内容合并到一个巨大的 guice 模块中。

@Provides
@Singleton
public LogPublisher getLogPublisher() {...}

这是执行此操作的正确方法吗?我收到 Java findBugs 错误说 unwritten field 所以我想我做错了。

@Provides/@Named 注释的帮助下声明您的 Retryer

    @Provides
    @Singleton
    @Named("toyRetryer")
    public Retryer getToyRetryer(LogPublisher logPublisher) {
        return RetryerBuilder.withLogPublisher(logPublisher).build();
    }