2012-01-12 4 views
6

Интересно, вызывается ли метод инициализации HttpServlet после десериализации.Жизненный цикл HttpServlet и сериализация

Я не знаю, если какой-либо контейнер когда-либо сериализует сервлет, но он реализует интерфейс Serializable, поэтому есть возможность сделать это.

В JavaDoc для метода init указывается: «Вызывается контейнером сервлета, чтобы указать сервлет, который сервлет вводится в эксплуатацию».

Является ли десериализация равным «введенным в эксплуатацию»?

+2

Я уверен, что сервлет никогда не сериализуется. Это синглтон, и он обычно полностью без гражданства. Я бы не стал разбираться в его сериализации. Во всяком случае, без повторного создания или десериализации, метод init должен вызываться, когда он помещается в действие, поэтому контейнер сервлетов будет нарушать спецификацию, если он помещает сервлет в сервисы без его инициализации. –

ответ

5

Хотя я никогда не имел дело с контейнером, который заменил бы сервлет, сериализовывая его, и я, честно говоря, не могу представить, когда современный контейнер будет делать это, но я всегда понимал, что init() вызывается ровно один раз для сервлета в его жизненном цикле, так что не будет снова на десериализацию. Как и в случае с Serializable, вам нужно написать специальную обработку, выполнив readFields().

+3

Хорошо, здесь он начинает усложняться. GenericServlet (который вводит интерфейс Serializable в иерархии) только говорит: «Вызывается контейнером сервлета, чтобы указать сервлету, что сервлет находится в обслуживании». Другой момент: «Контейнер сервлета вызывает метод init ровно один раз после создания экземпляра сервлета». говорится в JavaDoc интерфейса сервлета, который не является сериализуемым. – cpater

+2

Еще один момент заключается в том, что ServletConfig, который передается методу init, хранится в переходном поле ... – cpater