Метод инициализации Spring Controller - PullRequest
4 голосов
/ 13 июля 2010

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

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

Ответы [ 2 ]

20 голосов
/ 13 июля 2010

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

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

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

3 голосов
/ 13 июля 2010

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

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

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

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

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

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

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

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

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