Контроллер Spring init метод

насколько я понимаю, пружинные контроллеры право не сохраняющее состояние? Если я установил поле на значение, это отменяется следующим вызовом.

Существует ли возможность добавить init-метод или что-то? Метод, который называют однажды, когда мой контроллер инициирован? Я использую пружину 3.0 и банкомат конфигурации аннотации.

5
задан onigunn 13 July 2010 в 12:09
поделиться

2 ответа

Контроллеры Spring по умолчанию должны обрабатываться без сохранения состояния, это правильно. Тем не менее, это не означает, что ваша стоимость будет отозвана при следующем звонке. С точки зрения программистов, невозможно решить, получите ли вы тот же экземпляр вашего контроллера или другой экземпляр. Более того, не гарантируется, что никто другой не использовал контроллер (и, следовательно, тем временем изменил его состояние). Вот почему вообще не рекомендуется сохранять какое-либо состояние в полях вашего контроллера. Возможно, вам стоит пересмотреть необходимость поля в вашем контроллере.

На самом деле существует метод инициализации для Spring beans. Вы можете просто аннотировать общедоступный метод void на своем контроллере с помощью @PostConstruct . Этот метод выполняется после внедрения зависимостей . Таким образом, этот метод вызывается ровно через 1 раз после создания экземпляра контроллера.

Насколько я понимаю ваш вопрос, вы ищете метод, который выполняется перед каждым вызовом метода вашего контроллера. В этом случае вы можете просто вызвать свой метод "init" в начале каждого из методов вашего контроллера . Если вы не хотите делать это явно в своем коде, АОП предоставит вам альтернативу.

21
ответ дан 18 December 2019 в 06:34
поделиться

Насколько я понимаю, контроллеры Spring не имеют состояния, верно? Если я устанавливаю для поля значение, оно отменяется при следующем вызове.

Я считаю, что это неверно: контроллеры Spring могут быть с отслеживанием состояния . Однако вы должны быть очень осторожны, потому что ожидается, что контроллер будет реентерабельным и поточно-ориентированным, а также поддерживать несколько потоков, одновременно выполняющих несколько запросов.

Вероятно, можно с уверенностью сказать, что наилучшая практика для контроллера, который должен быть разработан таким образом, чтобы он не имел состояния; т.е. нет состояния, которое изменяется, пока контроллер "жив".

Есть ли возможность добавить метод инициализации или что-то в этом роде?

Не совсем понятно, что вы имеете в виду. Однако:

  • Контроллер handleRequest вызывается для запуска запроса.
  • Если вы объявите какой-либо компонент (например, объект управления) как ApplicationContextAware , он будет вызван обратно, чтобы сообщить ему о ApplicationContext.
  • Если вы объявите какой-либо bean-компонент как ServletContextAware , он будет вызван обратно, чтобы сообщить ему о ServletContext.
  • Если вы объявите какой-либо компонент как InitializingBean , он будет отозван, когда все свойства будут установлены.

И, несомненно, есть другие обратные вызовы и перехватчики, которые вы могли бы использовать для запуска некоторой отложенной инициализации / настройки контекста.

(Я не уверен, как эти обратные вызовы / перехватчики сопоставляются с аннотациями ... но я уверен, что это так.)

3
ответ дан 18 December 2019 в 06:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: