Перемещение JSF Managed Beans в Spring beans - PullRequest
6 голосов
/ 04 августа 2010

Я только что представил Spring в веб-приложении JSF, и теперь я испытываю желание превратить мои управляемые JSF-компоненты в bean-объекты Spring, переместив эти bean-компоненты в XML-файл contextConfigLocation (с указанием org.springframework.web.jsf.el. SpringBeanFacesELResolver в face-config.xml) вместо компонентов в файле Face-config.xml.

Я вижу много преимуществ, если я перехожу к бинам Spring (например, получая функциональность внедрения зависимостей) по сравнению с JSF-бинами, поэтому я вряд ли могу поспорить с переходом на бины Spring, но я хотел бы услышать от других, с какими проблемами я могу столкнуться если я сделаю это, или какова лучшая практика для этого случая.

Ответы [ 2 ]

5 голосов
/ 04 августа 2010

Единственная серьезная проблема может заключаться в том, что вы тесно связываете JSF с Spring и что ваши представления / модели JSF больше не могут быть повторно использованы без Spring. Единственной возможной альтернативой будет обновление до JSF 2.0 / Java EE 6 и использование Java EE 6, предоставленной средствами внедрения зависимостей, вместо использования сторонней структуры DI. С другой стороны, текущие преимущества являются надежными. Вы можете просто сделать это.

2 голосов
/ 12 августа 2015

Не перемещайте управляемые JSF-компоненты в Spring-компоненты. Жизненные циклы (области видимости) JSF и Spring не совпадают полностью. Например, область просмотра и область диалога отсутствуют в Spring Framework.

Вместо этого сохраняйте компоненты поддержки JSF как компоненты, управляемые JSF, и автоматически подключайте к ним компоненты Spring.

Определите абстрактный суперкласс для базовых компонентов JSF следующим образом:

public abstract class AutowireableManagedBean {

    protected AutowireCapableBeanFactory ctx;

    @PostConstruct
    protected void init() {
        logger.debug("init");
        ctx = WebApplicationContextUtils
                .getWebApplicationContext(
                        (ServletContext) FacesContext.getCurrentInstance()
                                .getExternalContext().getContext())
                .getAutowireCapableBeanFactory();
        // The following line does the magic
        ctx.autowireBean(this);
    }
   ...
}

Затем заставьте свои бины расширять этот суперкласс, и вы сможете автоматически связывать бины Spring и использовать область видимости, специфичную для JSF:

@ManagedBean
@ViewScoped
public class MyBackingBean extends AutowireableManagedBean {

    @Autowired
    private MyDao myDao;

Дополнительная информация в этой статье: http://www.beyondjava.net/blog/integrate-jsf-2-spring-3-nicely/

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