Я пытаюсь использовать внедрение поставщика для внедрения предварительно сконфигурированного объекта на фабрику:
public class CacheBuilderProvider
implements Provider<CacheBuilder<Object, Object>> {
public CacheBuilder<Object, Object> get () {
//Log the cache builder parameters before creation
CacheBuilder<Object, Object> cacheBuilder = CacheBuilder.newBuilder();
//configure the cacheBuilder
return cacheBuilder;
}
}
public class MyCacheFactory {
private final CacheBuilder<Object, Object> cacheBuilder;
@Inject
public MyFactory(CacheBuilder<Object, Object> cacheBuilder) {
this.cacheBuilder = cacheBuilder;
}
}
public class CacheModule extends AbstractModule {
@Override
protected void configure() {
bind(CacheBuilder.class)
.toProvider(CacheBuilderProvider.class)
.in(Singleton.class);
bind(MyCacheFactory.class)
.in(Singleton.class);
}
}
Когда я использую инжектор для получения экземпляра MyCacheFactory
, я не получаю вывод журнала иненастроенный экземпляр CacheBuilder<Object, Object>
;ни одна из моих настроек не была применена.Установка точек останова подтверждает, что провайдер никогда не используется.
Я также пытался применить @Named("MyCacheBuilder")
к соответствующим элементам:
public class CacheBuilderProvider
implements Provider<CacheBuilder<Object, Object>> {
@Named("MyCacheBuilder")
public CacheBuilder<Object, Object> get () { //... }
}
public class MyCacheFactory {
//...
@Inject
public MyFactory(
@Named("MyCacheBuilder")
CacheBuilder<Object, Object> cacheBuilder
) {
//...
}
}
Когда я пытаюсь запустить этот код, я получаюa CreationException
:
1) No implementation for com.google.common.cache.CacheBuilder
annotated with @com.google.inject.name.Named(value=MyCacheBuilder) was bound.
Я также пробовал различные комбинации необработанных и общих ссылок на типы в объявлениях класса и конструктора, но без дополнительного успеха.
Я могу обойти этопросто создав провайдера и связав экземпляр, возвращенный из get()
сам, но я ожидаю (и deisre), что Guice сделает это за меня.
Что-то не так (или очевидно) не так с моей настройкой?