Статический метод против прототипа bean-компонента

У меня есть служебный метод, который принимает строку в качестве входного параметра и дает мне объект, соответствующий вводу. Мне нужно вызвать этот служебный метод из метода сопоставления запросов загрузки Spring.

Теперь мой вопрос: каковы преимущества и недостатки двух нижеперечисленных подходов?

  1. Сделайте служебный метод статическим и вызовите его.
  2. Сделайте метод как прототип bean-компонента и вызовите bean-компонент.

Пример кода для подхода 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: Образцы собраны из другого поста.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
495
1

Ответы 1

Если вы уже используете 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().

Область по умолчанию - одиночка (одноэлементная область является областью по умолчанию в Spring)

caco3 09.09.2018 13:30

Я не могу использовать синглтон в качестве входного параметра для изменений bean-компонента, и тип возвращаемого значения будет основываться на входном параметре, добавленном вспомогательном методе, о котором идет речь.

user2968937 09.09.2018 16:00

Другие вопросы по теме