如何在不使用Spring IOC的情况下在JSF托管bean中注入服务

时间:2013-01-22 21:56:37

标签: spring jsf dependency-injection

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

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

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

使用JSF时如何做同样的事情?我不想为bean使用两个IOC容器,而是将它保存在faces context本身。我见过像

这样的链接

JSF 2 inject Spring bean/service with @ManagedProperty and no xml

A problem about injecting spring bean into jsf bean。他们谈论将Spring托管bean注入JSF上下文。 我想要做的事情必须非常简单,但无法找到任何相关信息。我是新手,会感激任何帮助。

2 个答案:

答案 0 :(得分:6)

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

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

JSF IoC容器非常简单,它不允许您将其生命周期配置为包括事务管理,AOP等。那些与Spring(或EJB,在Java EE环境中)有关的事情。

因此,在使用Spring的JSF时,通常有两种选择:

  1. 您可以将JSF页面的支持bean放在JSF容器中,并使用@ManagedBean@RequestScoped@ViewScoped等注释它们;并在属性中注入任何必需的带有@ManagedProperty的Spring bean(需要一个setter)
  2. 或者跳过JSF容器并将支持bean与所有其他容器一起放在Spring容器中,并使用Spring的scope / session范围,用Spring的注释@Component@Scope("request")注释它们,{ {1}}并注入@Scope("session")@Autowired等。
  3. 就个人而言,面对这个选择,我会选择第一个选择,因为它会给你@Qualifier和其他一些细节。这是真的,它使用了两个IoC容器但是,那个Java EE应用程序没有?

    如果你想要第二条路线,你也可以add a view scope for Spring beans, backed by JSF viewMap

答案 1 :(得分:2)

Spring称之为&#34;服务&#34;在Java EE术语中是&#34; EJB&#34;。 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;

}

那就是它。不需要吸气剂/固定剂。没有必要的XML样板。