Потому что только конструкторы, помеченные @Autowired
, будут обрабатываться и внедрять зависимости.Конструктор для Strategy2
и Strategy3
игнорируется, поскольку на нем нет @Autowired
.
У вас есть два варианта:
(1) Изменить, чтобы использовать инъекцию поля, а не конструкторинъекции:
public class StrategyFactory {
@Autowired
private Strategy1 strategy1;
@Autowired
private Strategy2 strategy2;
@Autowired
private Strategy3 strategy3;
StrategyFactory(){}
}
(2) Продолжайте использовать конструктор инъекций.Поскольку вся Стратегия GenericStrategy
, вы можете вместо этого автоматически связать список GenericStrategy
в конструкторе.Затем проверьте его класс для возврата фактического экземпляра.
Коды будут выглядеть следующим образом:
public class StrategyFactory {
private List<GenericStrategy> strategy;
@Autowired
public StrategyFactory(List<GenericStrategy> strategy) {
this.strategy = strategy1;
}
public GenericStrategy getTrailerStrategy(String strategy) {
LOGGER.info("Retrieving Strategy Class for {}", strategy);
GenericStrategy result = null;
if (strategy.equals("CLOSE_DETAIL")) {
result = getStrategy(Strategy1.class);
}
else if(strategy.equals("LOAD_TRAILER")) {
result = getStrategy(Strategy2.class);
}
else if(strategy.equals("CLOSE_SUMMARY")) {
result = getStrategy(Strategy3.class);
}
else {
throw new InvalidStrategyTypeException("Invalid Strategy Type");
}
if(result == null){
throw new RuntimeException("Fail to load the strategy....");
}
}
private <T> GenericStrategy getStrategy(Class<T> clazz){
for(GenericStrategy s : strategy){
if(clazz.isInstance(s)){
return s;
}
}
return null;
}
}