Жизненный цикл 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,

Смотрите также:

Другие вопросы по тегам