Почему я так себя не веду, возможно потому, что вы используете AutowireCapableBeanFactory
напрямую и даже хуже, чем в сочетании с @Cacheable
.
Вам следует пересмотреть ваш код уровня рамки .Я считаю, что вы никогда не должны использовать AutowireCapableBeanFactory
напрямую, особенно в вашем случае.Это просто, и вы можете достичь того же результата с меньшими усилиями и с помощью простого Map
из country_code + membershi_type -> processor
, например:
@Configuration
public class ProcessorConfiguration {
. . .
@Bean("cAOrderProcessor ")
public IOrderProcessor cAOrderProcessor() [
return new CAOrderProcessor();
}
. . .
@Bean
public IOrderProcessorFactory processorFactory() {
// create country_code + membershi_type -> processor map
Map<ProcessorKey, IOrderProcessor> processorMap = new HashMap<>();
// not sure about values in MembershipType, so I put SOME just for example
// this map also can be a bean if you're gonna need that in other parts of app
processorMap.put(new ProcessorKey("CA", MembershipType.SOME), cAOrderProcessor());
// set it to factory
return new OrderProcessorFactoryPropImpl(processorMap );
}
. . .
}
public class OrderProcessorFactoryPropImpl implements IOrderProcessorFactory {
private final Map<ProcessorKey, IOrderProcessor> processorMap;
public OrderProcessorFactoryPropImpl(Map<ProcessorKey, IOrderProcessor> processorMap) {
this.processorMap = processorMap;
}
@Override
// @Cacheable("orderProcessor") you dont need that because get it from map costs nothing
// changed the name to "get" instead of "create"
public IOrderProcessor getOrderProcessor(String countryCode, MembershipType membership) {
// just get processor by key
return processorMap.get(constructKey(countryCode, membership));
}
private ProcessorKey constructKey(String countryCode, MembershipType membership) {
return new ProcessorKey(countryCode, membership);
}
}
Также я заметил, что вы смешивает Java-компонент и bean-компонент на основе аннотацийconfig , что считается плохой практикой.Надеюсь, что это поможет.
Обновление 1 - Ответ на комментарий
Что ж, чтобы выяснить, что не тому человеку понадобится полная копия вашего приложения для отладки/ регистрирует и воспроизводит обычные сценарии использования.Вероятно, невозможно сказать, что не так, просто взглянув на примеры, которые вы предоставили (по крайней мере, для меня).
И я только что отметил, что способ использования AutowireCapableBeanFactory
не подходит для лучших практик иВот почему у вас есть проблемы во время выполнения.
Таким образом, у вас, вероятно, есть 2 решения:
Избавьтесь от него и используйте несколько иной подход (возможно, аналогичный тому, который я предлагал ранее).Я считаю, что это только один хороший вариант.Но это решать вам.
Включите пружинные бревна и надейтесь, что вы обнаружите там проблему.Вероятно, нужно включить журналы отладки, как это в вашем log4j.xml
(я полагаю, это log4j, но может быть что-то еще):
<category name="org.springframework.beans">
<priority value="debug" />
</category>