Как заставить экземпляр компонента, определяемый приложением, создавать экземпляр при запуске приложения?

Я не могу найти способ заставить экземпляр bean-объекта, определяемый приложением, быть инициализированным / инициализированным при запуске веб-приложения. Кажется, что bean-объекты области приложения лениво создаются при первом обращении к bean-компоненту, а не при запуске веб-приложения. Для моего веб-приложения это происходит, когда первый пользователь впервые открывает страницу в веб-приложении.

Причина, по которой я хочу этого избежать, заключается в том, что во время инициализации моего bean-объекта области действия приложения происходит много трудоемких операций с базой данных. Он должен извлечь кучу данных из постоянного хранилища, а затем кэшировать некоторые из них, которые будут часто отображаться пользователю в виде элементов ListItem и т. Д. Я не хочу, чтобы все это происходило, когда первый пользователь подключается и, таким образом, вызывать длительную задержку.

Моей первой мыслью было использовать метод ServletContextListener старого стиля contextInitialized () и оттуда использовать ELResolver для ручного запроса экземпляра моего управляемого компонента (таким образом, вызывая инициализацию). К сожалению, я не могу использовать ELResolver для запуска инициализации на этом этапе, поскольку для ELResolver требуется FacesContext, а FacesContext существует только в течение срока службы запроса.

Кто-нибудь знает альтернативный способ сделать это?

Я использую MyFaces 1.2 в качестве реализации JSF и не могу перейти на 2.x в настоящее время.

37
задан BalusC 19 January 2016 в 08:54
поделиться

2 ответа

Моей первой мыслью было использовать старый метод ServletContextListener contextInitialized(), а оттуда использовать ELResolver для ручного запроса экземпляра моего управляемого компонента (таким образом вызывая инициализацию). К сожалению, я не могу использовать ELResolver для запуска инициализации на этом этапе, потому что ELResolver нуждается в FacesContext, а FacesContext существует только в течение срока действия запроса.

Это не должно быть таким сложным. Просто создайте экземпляр компонента и поместите его в область приложения с тем же тем же именем управляемого компонента в качестве ключа. JSF просто повторно использует bean-компонент, если он уже присутствует в области видимости. С JSF поверх Servlet API, ServletContext представляет область приложения (поскольку HttpSession представляет область сеанса, а HttpServletRequest представляет область запроса, каждый с setAttribute() и getAttribute()).

Так и должно быть,

public void contextInitialized(ServletContextEvent event) {
    event.getServletContext().setAttribute("bean", new Bean());
}

где "bean" должно совпадать с bean-компонента приложения в faces- config.xml.


Для протокола: в JSF 2.x все, что вам нужно сделать, это добавить eager=true к @ManagedBean в компоненте @ApplicationScoped. .

@ManagedBean(eager=true)
@ApplicationScoped
public class Bean {
    // ...
}

Затем он будет автоматически создан при запуске приложения.

Или, когда вы управляете резервными компонентами с помощью CDI @Named, возьмите OmniFaces @Eager :

@Named
@Eager
@ApplicationScoped
public class Bean {
    // ...
}
57
ответ дан 27 November 2019 в 04:35
поделиться

Насколько мне известно, вы не можете принудительно создать экземпляр управляемого компонента при запуске приложения.

Может быть, вы могли бы использовать ServletContextListener, который вместо создания экземпляра вашего управляемого компонента будет сам выполнять все операции с базой данных?


Другим решением может быть создание экземпляра вашего bean-компонента вручную при запуске приложения, а затем установка bean-компонента в качестве атрибута вашего ServletContext.

Вот пример кода:

public class MyServletListener extends ServletContextListener {

    public void contextInitialized(ServletContextEvent sce) {
        ServletContext ctx = sce.getServletContext();
        MyManagedBean myBean = new MyManagedBean();
        ctx.setAttribute("myManagedBean", myManagedBean);
    }

}

На мой взгляд, это далеко не чистый код, но, похоже, он помогает.

2
ответ дан 27 November 2019 в 04:35
поделиться
Другие вопросы по тегам:

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