В CDI вы можете использовать Qualifer, чтобы идентифицировать различные экземпляры и методы производителя, чтобы предоставить эти экземпляры.
public class ControllerFactory {
@Produces
@StrategyA
public Controller createControllerA {
return new Controller(configA);
}
@Produces
@StrategyB
public Controller createControllerB {
return new Controller(configB);
}
}
@StrategyB
@Inject
Controller howToAccessIt;
Если вам не нравится создавать новую StrategyA/B/C
Аннотация для каждой стратегии, вы можетеиспользуйте одну аннотацию с полем (например, Enum), которое идентифицирует стратегию.Чтобы вы могли написать: @Strategy(StratType.A)
.
Затем вы можете использовать InjectionPoint
в своем методе продюсера, чтобы вы могли создавать экземпляр в зависимости от аннотации в общем виде вместо написания новогометод производителя для каждой стратегии:
@Produces
//must add a Annotation to clarify that this producer produces for all Strategies!
public Controller createController(InjetionPoint ip) {
Annotated annotated = ip.getAnnotated();
if (annotated.isAnnotationPresent(Strategy.class)) {
Strategy stragtegyAnnotation = (Strategy) annotated.getAnnotation(Strategy.class);
switch(stragtegyAnnotation.value) {
case A: return new Controller(configA);
...
}
}
}