Интеграция 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 меня есть два возможных способа:
-
Выберите 9X_spring-java-config свойство в ManagedBean (например, «BasicDAO 9X_spring-java-config dao») и объявите
@ManagedProperty(#{"basicDAO"})
над свойством. Делая это, я 9X_spring-java-config внедряю bean-компонент"basicDAO"
из Spring в ManagedBean. -
Объявлен 9X_dependency-injection @Controller в классе ManagedBean, тогда 9X_spring-config у меня будут аннотации
@ManagedBean
и@Controller
, все вместе. И 9X_managed-bean в свойстве"BasicDAO dao"
я должен использовать@Autowired
из Spring.
Я 9X_jsf правильно понимаю?
Ответ #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. } }
См. также:
- When is it necessary or convenient to use Spring or EJB3 or all of them together?
- JSF Service Layer
- Backing beans (@ManagedBean) or CDI Beans (@Named)?
- Using JSF as view technology of Spring MVC
- How to install and use CDI on Tomcat?
Ответ #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. }
- Причина, по которой я сказал «почти склонен_ к отрицательному голосованию», заключалась в том, что это зависело от того, что вы являетесь тем же человеком, что и ОП, с другой учетной записью. Если нет, я не буду го ...
Ответ #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 для обоих.
-
2
-
5
-
4
-
4
-
3
-
1
-
7
-
5
-
2
-
2
-
1
-
3
-
3
-
2
-
6
-
1
-
18
-
1
-
4
-
4
-
10
-
12
-
11
-
3
-
8
-
4
-
3
-
1
-
2
-
6
-
3
-
4
-
4
-
2
-
4
-
3
-
3
-
4
-
8
-
2
-
5
-
3
-
2
-
1
-
1
-
6
-
3
-
3
-
3
-
5