Hello,
In general I can annotate @Named classes with @Priority and injection will take this into account properly returning the highest priority binding:
public class FirstImpl implements Service
@Named @Priority(10)
public class SecondImpl implements Service
// the following will return SecondImpl as the first candidate
locator.locate(Keys.get(Service.class));
@Priority however seems to be ignored when a Provider is used. For example:
public class FirstImpl implements Service
@Named @Priority(10)
public class SecondImplProvider implements Provider<Service>
// the following will return FirstImpl
locator.locate(Keys.get(Service.class));
I tried to work around the above issue specifying a custom ranking function like the following, and it seems to solve my problem. My questions are:
- is the above expected, shouldn't priority be honored also if declared on Providers ?
- the custom ranking function below seems to solve the problem, but it performs a nested lookup using the BeanLocator. Is this acceptable or a bad practice? Are there better ways to solve this issue? I tried to look into BeanLocator, RankedBindings, RankedSequence, and the Guice SPI but I could not find an easy solution.
public class CustomRankingFunction implements RankingFunction {
private DefaultRankingFunction delegate;
@Inject
private DefaultBeanLocator locator;
public CustomRankingFunction(final int primaryRank) {
delegate = new DefaultRankingFunction(primaryRank);
}
public CustomRankingFunction() {
this(0);
}
public int maxRank() {
return delegate.maxRank();
}
public <T> int rank(final Binding<T> binding) {
if (binding instanceof ProviderKeyBinding) {
ProviderKeyBinding pkb = (ProviderKeyBinding) binding;
BeanEntry o1 = (BeanEntry) locator.locate(pkb.getProviderKey()).iterator().next();
if (o1.getImplementationClass().isAnnotationPresent(Priority.class)) {
Priority p = (Priority) o1.getImplementationClass().getAnnotation(Priority.class);
return p.value();
}
}
return delegate.rank(binding);
}
}
--
Gian Maria Romanato
<gm.romanato (at) gmail (dot) com>
_______________________________________________