У меня есть служебный метод, который принимает строку в качестве входного параметра и дает мне объект, соответствующий вводу. Мне нужно вызвать этот служебный метод из метода сопоставления запросов загрузки Spring.
Теперь мой вопрос: каковы преимущества и недостатки двух нижеперечисленных подходов?
Пример кода для подхода 1:
**//SourceSystem can change at runtime**
public static FixedLengthReport fixedLengthReport(String sourceSystem) {
return new TdctFixedLengthReport(sourceSystem, dao);
}
Пример кода для подхода 2:
@Bean
@Scope(value = "prototype")
**//SourceSystem can change at runtime**
public FixedLengthReport fixedLengthReport(String sourceSystem) {
return new TdctFixedLengthReport(sourceSystem, dao);
}
PS: Образцы собраны из другого поста.




Если вы уже используете Spring, выберите bean-компонент singleton (один объект bean-компонента на экземпляр контейнера Spring) (который является областью действия по умолчанию), что нормально, если ваш статический метод не имеет общего состояния. Если вы выберете прототип, контейнер Spring будет возвращать новый экземпляр объекта bean для каждого вызова getBean(). И внедрить этот bean-компонент в объекты, которым необходимо вызвать этот метод. Этот подход также более удобен для модульного тестирования, чем статический метод, потому что вы можете предоставить тестовую реализацию bean-компонента с таким методом в контексте тестового приложения. В случае статического метода вам понадобится PowerMock или другие сторонние библиотеки, чтобы имитировать метод палки для модульного тестирования.
ОБНОВИТЬ
В вашем случае должен быть новый bean
@Service
public MyReportBeanFactory {
@Autowired
private Dao dao;
public FixedLengthReport fixedLengthReport(String sourceSystem) {
return new TdctFixedLengthReport(sourceSystem, dao);
}
}
Затем вам нужно внедрить этот фабричный компонент в классы, в которых вы хотите вызвать fixedLengthReport().
Я не могу использовать синглтон в качестве входного параметра для изменений bean-компонента, и тип возвращаемого значения будет основываться на входном параметре, добавленном вспомогательном методе, о котором идет речь.
Область по умолчанию - одиночка (одноэлементная область является областью по умолчанию в Spring)