Интеграция Spring JSF: как внедрить компонент / службу Spring в управляемый bean-компонент JSF?

Я понимаю, что управляемый компонент работает 9X_spring-framework как контроллер, потому что ваша единственная 9X_spring задача - «связать» уровень представления 9X_spring-config с моделью.

Чтобы использовать bean-компонент 9X_spring-java-config в качестве управляемого bean-компонента, я 9X_di должен объявить аннотацию @ManagedBean, при этом я могу 9X_spring напрямую общаться JSF с bean-компонентом.

Если 9X_jsf я хочу внедрить какой-либо компонент (из 9X_managed-bean Spring) в этот управляемый компонент, у 9X_integration меня есть два возможных способа:

  1. Выберите 9X_spring-java-config свойство в ManagedBean (например, «BasicDAO 9X_spring-java-config dao») и объявите @ManagedProperty(#{"basicDAO"}) над свойством. Делая это, я 9X_spring-java-config внедряю bean-компонент "basicDAO" из Spring в ManagedBean.

  2. Объявлен 9X_dependency-injection @Controller в классе ManagedBean, тогда 9X_spring-config у меня будут аннотации @ManagedBean и @Controller, все вместе. И 9X_managed-bean в свойстве "BasicDAO dao" я должен использовать @Autowired из Spring.

Я 9X_jsf правильно понимаю?

49
0
3
Общее количество ответов: 3

Ответ #1

Ответ на вопрос: Интеграция Spring JSF: как внедрить компонент / службу Spring в управляемый bean-компонент JSF?

@ManagedBean против @Controller

Прежде всего, вам следует выбрать одну структуру 9X_spring-java-config для управления вашими bean-компонентами. Вы 9X_spring должны выбрать JSF или Spring (или CDI) для 9X_dependency-injection управления вашими bean-компонентами. Хотя 9X_spring-config следующее работает, это в корне неверно:

@ManagedBean // JSF-managed. @Controller // Spring-managed. public class BadBean {} 

В 9X_dependency-injection результате вы получаете два полностью отдельных 9X_spring экземпляра одного и того же класса управляемого 9X_di компонента, один из которых управляется 9X_spring-config JSF, а другой - Spring. Непосредственно 9X_dependency-injection неясно, какой из них на самом деле будет использоваться 9X_jsf в EL, если вы укажете его как #{someBean}. Если у вас 9X_di есть SpringBeanFacesELResolver, зарегистрированный в faces-config.xml, то он будет 9X_dependency-injection управляемым Spring, а не JSF. Если у вас 9X_managed-bean его нет, то он будет управляться JSF.

Кроме 9X_managed-bean того, когда вы объявляете область видимости 9X_integration управляемого bean-объекта JSF, например 9X_spring-config @RequestScoped, @ViewScoped, @SessionScoped или @ApplicationScoped из пакета javax.faces.*, он будет распознаваться 9X_jsf и использоваться только @ManagedBean. Это не будет воспринято 9X_managed-bean @Controller, поскольку оно ожидает собственной аннотации 9X_spring-config @Scope. По умолчанию используется одноэлементный 9X_dependency-injection (область приложения), если он отсутствует.

@ManagedBean // JSF-managed. @ViewScoped // JSF-managed scope. @Controller // Spring-managed (without own scope, so actually becomes a singleton). public class BadBean {} 

Когда 9X_spring-java-config вы ссылаетесь на указанный выше bean-компонент 9X_spring-config через #{someBean}, он возвращает bean-компонент с областью 9X_spring-config видимости приложения, управляемый Spring, а 9X_jsf не JSF-компонент с областью видимости.


@ManagedProperty против @Autowired

Специфичный 9X_spring-config для JSF элемент @ManagedProperty работает только в bean-компонентах, управляемых 9X_spring JSF, т.е. когда вы используете @ManagedBean. Специфичный 9X_spring-config для Spring @Autowired работает только в bean-компонентах, управляемых 9X_spring-java-config Spring, т.е. когда вы используете @Controller. Нижеперечисленные 9X_spring-framework подходы менее или более эквивалентны и не 9X_dependency-injection могут быть смешаны:

@ManagedBean // JSF-managed. @RequestScoped // JSF-managed scope. public class GoodBean { @ManagedProperty("#{springBeanName}") private SpringBeanClass springBeanName; // Setter required. } 
@Component // Spring-managed. @Scope("request") // Spring-managed scope. public class GoodBean { @Autowired private SpringBeanClass springBeanName; // No setter required. } 

Обратите внимание, что 9X_spring-java-config если SpringBeanFacesELResolver зарегистрирован в faces-config.xml в соответствии 9X_spring-java-config с javadoc,

 ... org.springframework.web.jsf.el.SpringBeanFacesELResolver 

и, таким образом, вы можете ссылаться 9X_spring-config на управляемые компоненты Spring в EL через 9X_jsf #{springBeanName}, тогда вы можете просто ссылаться на них 9X_jsf также в @ManagedProperty, поскольку он в основном устанавливает 9X_integration результат оценки данного выражения EL. Наоборот, внедрение 9X_di управляемого bean-объекта JSF через @Autowired никоим 9X_spring-framework образом не поддерживается. Однако вы можете 9X_spring-java-config использовать @Autowired в управляемом компоненте JSF, когда 9X_spring-java-config расширяете свой компонент из SpringBeanAutowiringSupport. Это автоматически 9X_spring-framework зарегистрирует экземпляр управляемого компонента 9X_di JSF в контексте автозапуска Spring во время 9X_jsf вызова конструктора, что означает, что все 9X_spring-java-config @Autowired будет доступно в @PostConstruct и более поздних версиях.

@ManagedBean // JSF-managed. @ViewScoped // JSF-managed scope. public class GoodBean extends SpringBeanAutowiringSupport implements Serializable { @Autowired private SpringBeanClass springBeanName; // No setter required. @PostConstruct private void init() { // springBeanName is now available. } } 

Или, если 9X_di ваша архитектура не позволяет расширять 9X_spring-framework bean-компоненты из другого базового класса, вы 9X_managed-bean всегда можете вручную зарегистрировать экземпляр 9X_spring управляемого bean-компонента JSF в контексте 9X_integration автозапуска Spring, как показано ниже. См. Также 9X_managed-bean трюк How to integrate JSF 2 and Spring 3 (or Spring 4) nicely.

@ManagedBean // JSF-managed. @ViewScoped // JSF-managed scope. public class GoodBean implements Serializable { @Autowired private SpringBeanClass springBeanName; // No setter required. @PostConstruct private void init() { FacesContextUtils .getRequiredWebApplicationContext(FacesContext.getCurrentInstance()) .getAutowireCapableBeanFactory().autowireBean(this); // springBeanName is now available. } } 

@XxxScoped против @Scope

Spring @Scope имеет ограниченную поддержку 9X_integration областей JSF. Нет эквивалента для @ViewScoped JSF. По 9X_jsf сути, вы либо создадите свои собственные 9X_spring-config области действия, либо придерживаетесь ручной 9X_spring регистрации экземпляра управляемого компонента 9X_jsf JSF в контексте автозапуска Spring, как 9X_spring-java-config показано выше.

С другой стороны, Spring WebFlow 9X_dependency-injection был принят в JSF 2.2 с помощью новой аннотации 9X_di @FlowScoped. Так что, если вы уже используете JSF 2.2, вам 9X_dependency-injection не обязательно использовать Spring WebFlow, если 9X_managed-bean вам нужна исключительно область потока.


CDI - пытаемся все объединить

Начиная 9X_di с Java EE 6, CDI предлагается как стандартная 9X_di альтернатива Spring DI. Он имеет соответственно 9X_di аннотации @Named и @Inject для этого, а также свой собственный 9X_di набор областей видимости. Я не уверен, как 9X_spring-config он взаимодействует со Spring, поскольку 9X_managed-bean я не использую Spring, но @Inject работает внутри 9X_di @ManagedBean, а @ManagedProperty внутри @ManagedBean может ссылаться на bean-компонент 9X_spring-framework @Named. С другой стороны, @ManagedProperty не работает внутри 9X_spring-config компонента @Named.

Целью CDI является объединение 9X_di всех различных фреймворков управления компонентами 9X_spring-framework в единую спецификацию / интерфейс. Spring 9X_spring-config мог бы быть полной реализацией CDI, но они 9X_spring решили реализовать ее лишь частично (поддерживается 9X_spring-config только JSR-330 javax.inject.*, но не JSR-299 javax.enterprise.context.*). См. Также 9X_managed-bean Will Spring support CDI? и this tutorial.

JSF будет перемещен на CDI для управления 9X_jsf bean-компонентами и в будущей версии исключит 9X_managed-bean поддержку @ManagedBean и его друзей.

@Named // CDI-managed. @ViewScoped // CDI-managed scope. public class BetterBean implements Serializable { @Inject private SpringBeanClass springBeanName; // No setter required. @PostConstruct private void init() { // springBeanName is now available. } } 

См. также:

102
0

Ответ #2

Ответ на вопрос: Интеграция Spring JSF: как внедрить компонент / службу Spring в управляемый bean-компонент JSF?

Есть еще один способ использовать bean-компоненты, управляемые 9X_dependency-injection Spring, в bean-компонентах, управляемых 9X_di JSF, просто расширив ваш JSF-компонент из 9X_spring-config SpringBeanAutowiringSupport, и Spring обработает внедрение зависимостей.

@ManagedBean // JSF-managed. @ViewScoped // JSF-managed scope. public class GoodBean extends SpringBeanAutowiringSupport { @Autowired private SpringBeanClass springBeanName; // No setter required. // springBeanName is now available. } 

14
2

  • Причина, по которой я сказал «почти склонен_ к отрицательному голосованию», заключалась в том, что это зависело от того, что вы являетесь тем же человеком, что и ОП, с другой учетной записью. Если нет, я не буду го ...

Ответ #3

Ответ на вопрос: Интеграция Spring JSF: как внедрить компонент / службу Spring в управляемый bean-компонент JSF?

Проще всего это сделать с помощью XML. Я 9X_managed-bean использовал @Component в уже созданном управляемом 9X_dependency-injection компоненте jsf, но @Autowired не работал, потому что 9X_managed-bean управляемый компонент уже был там в faces-config.xml. Если 9X_spring обязательно сохранить это определение управляемого 9X_di компонента вместе с его управляемым свойством 9X_di в XML-файле, рекомендуется добавить компонент 9X_spring-config Spring в качестве другого управляемого свойства 9X_spring-framework внутри тега управляемого компонента. Здесь 9X_integration Spring bean-компонент определен в spring-config.xml 9X_spring-java-config (может быть автоматически подключен где-то 9X_managed-bean поочередно). пожалуйста, обратитесь https://stackoverflow.com/a/19904591/5620851

отредактировал 9X_jsf я. Я предлагаю либо реализовать его полностью 9X_dependency-injection через аннотацию @Managed и @Component, либо 9X_spring через xml для обоих.

1
0