0

通常,如果我必须在 Spring 中注入服务,我会使用

 <bean id="mycontroller" class="com.MyController">
    <property name="myService" ref="myService" />

<bean id="myService" class="com.MyService"></bean>

使用 JSF 时如何做同样的事情?我不想为 bean 使用两个 IOC 容器,而是将其保存在 faces 上下文中。我看过链接,例如

JSF 2 使用 @ManagedProperty 注入 Spring bean/service 而没有 xml

以及关于将 spring bean 注入 jsf bean 的问题。他们谈论将 Spring 托管 bean 注入 JSF 上下文。我正在尝试做的事情必须非常简单,但无法找到任何相关信息。我是新手,将不胜感激。

4

2 回答 2

6

我想你可能对“豆”这个词感到困惑。问题是,你所说的“服务”也是一个 Spring bean,对吧?

根据您的配置,您可能将其作为服务使用,因为它具有 Spring 添加的一些附加功能(可能是事务管理)。

JSF IoC 容器非常简单,它不允许您将其生命周期配置为包括事务管理、AOP 和类似的东西。您必须使用 Spring(或 EJB,在 Java EE 环境中)做的那些事情。

因此,在将 JSF 与 Spring 结合使用时,您通常有两种选择:

  1. 要么将 JSF 页面的支持 bean 放在 JSF 容器中,用@ManagedBean@RequestScoped@ViewScoped等注释它们;并@ManagedProperty在属性中注入任何必要的 Spring bean(需要一个 setter)
  2. 或者跳过 JSF 容器,将所有其他的支持 bean 放在 Spring 容器中,并使用请求/会话的 Spring 范围,使用 Spring 的 annotations 注释它们@Component,并注入 with等。@Scope("request")@Scope("session")@Autowired@Qualifier

就个人而言,面对这个选择,我会选择第一选择,因为它会给你@ViewScoped和其他一些细节。确实它使用了两个 IoC 容器,但是,哪个 Java EE 应用程序没有呢?

如果您仍然想走第二条路线,您还可以为 Spring bean 添加一个视图范围,由 JSF viewMap 支持

于 2013-01-23T01:26:32.130 回答
2

Spring 所谓的“服务”在 Java EE 术语中是“EJB”。EJB 在 Glassfish、JBossAS 和 TomEE 等 Java EE Web 配置文件容器中是开箱即用的。

要创建无状态 EJB 服务,只需@Stateless在类上使用:

@Stateless
public class SomeService {

    public void doSomething() {
        // ...
    }

}

并将其注入 JSF 托管 bean,只需@EJB在要注入的属性上使用:

@ManagedBean
@ViewScoped
public class SomeController {

    @EJB
    private SomeService service;

}

而已。不需要getter/setter。不需要 XML 样板。

于 2013-01-23T12:37:45.103 回答