Жизненный цикл FacesContext?
Проходя через JavadocFacesContext
Я наткнулся на это предложение
Экземпляр остается активным до вызова метода release(), после чего дальнейшие ссылки на этот экземпляр не допускаются. Пока экземпляр FacesContext активен, на него нельзя ссылаться ни из одного потока, кроме того, в котором контейнер сервлета, выполняющий это веб-приложение, использует для обработки этого запроса
Значит ли это, что FacesContext
никогда не пойдет на сборку мусора, а экземпляр будет уничтожен только после остановки текущего веб-приложения (остановка сервера)?
Является FacesContext
следующий шаблон синглтона? В таком случае, как он будет себя вести, когда несколько запросов и поступают на рендеринг ответа одновременно, поскольку он обслуживает только один запрос за раз?
1 ответ
Значит ли это, что
FacesContext
никогда не пойдет на сборку мусора, а экземпляр будет уничтожен только после остановки текущего веб-приложения (остановка сервера)?
Нет, вы прочитали это неправильно. FacesContext
живет столько же, сколько один HTTP-запрос. Это (на самом деле, "может" - это более подходящее слово) не будет сразу же записано в GC, если вы неправильно ссылаетесь на него где-то в вашем собственном коде, выходящем за рамки его возможностей. Например, как свойство управляемого bean-объекта сессионной области, который живет дольше, чем один HTTP-запрос:
@ManagedBean
@SessionScoped
public class BadSessionBean {
// Bad Example! Never do this! Not threadsafe and instance can't be GC'ed by end of request!
private FacesContext context = FacesContext.getCurrentInstance();
}
Если вы не делаете этого где-либо в своем коде, и, таким образом, вы всегда получаете текущий экземпляр в локальной области метода, тогда у него будет шанс быть правильно GC'ed.
@ManagedBean
@SessionScoped
public class GoodSessionBean {
public void someMethod() {
// OK! Declared in method local scope and thus threadsafe.
FacesContext context = FacesContext.getCurrentInstance();
}
}
Обратите внимание, что это поведение GC не относится к JSF/ FacesContext
это просто специфично для базовой Java в целом.
Является
FacesContext
следующий шаблон синглтона? В таком случае, как он будет себя вести, когда несколько запросов и поступают на рендеринг ответа одновременно, поскольку он обслуживает только один запрос за раз?
Нет, это точно не синглтон. Это ThreadLocal
экземпляр, который создается FacesServlet
сразу после service()
метод вводится и уничтожается FacesServlet
прямо перед service()
Метод оставлен. Таким образом, существует только один экземпляр на запрос (и, следовательно, не на приложение). Обратите внимание, что один HTTP-запрос считается одним отдельным потоком. Может быть несколько потоков (читай: запросов) и, таким образом, может быть несколько экземпляров FacesContext
во время жизни приложения. Его основной узор - это рисунок фасада, но это не связано с тем, что ThreadLocal
,