Статический метод против боба-прототипа - PullRequest
0 голосов
/ 09 сентября 2018

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

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

  1. Сделать метод утилиты статическим и вызвать его.
  2. Сделать метод как прототип 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: образцы собраны из другого поста.

1 Ответ

0 голосов
/ 09 сентября 2018

Если вы уже используете Spring, тогда выберите singleton (один объект bean на экземпляр контейнера Spring) bean (который является областью по умолчанию), что нормально, если у вашего статического метода нет общего состояния. Если вы выберете прототип, контейнер Spring будет возвращать новый экземпляр объекта bean для каждого вызова getBean(). И внедрить этот компонент в объекты, которые должны вызвать этот метод. Этот подход также более удобен для модульных тестов, чем статический метод, потому что вы можете обеспечить тестовую реализацию bean-компонента таким методом в контексте тестового приложения. В случае статического метида вам понадобится PowerMock или другие сторонние библиотеки, чтобы смоделировать метод stick для модульного тестирования.

UPDATE

В вашем случае должен быть новый боб

@Service
public MyReportBeanFactory {

   @Autowired
   private Dao dao;

   public FixedLengthReport fixedLengthReport(String sourceSystem) {
      return new TdctFixedLengthReport(sourceSystem, dao);
   }
}

И затем вам нужно внедрить этот фабричный компонент в классы, в которые вы хотите позвонить fixedLengthReport()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...