2013-01-22 31 views
0

通常,如果我有注入春季服務我用如何在JSF注入服務管理的bean,而不使用Spring IOC

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

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

如何做使用JSF時是否一樣?我不想爲bean使用兩個IOC容器,而是將其保留在faces上下文中。我所看到的鏈接,如

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

A problem about injecting spring bean into jsf bean。他們討論將Spring託管bean注入到JSF上下文中。 我想要做的事情必須非常簡單,但無法找到任何相關信息。是新手,並會感謝任何幫助。

回答

6

我想你可能會被「bean」這個詞所困惑。 問題是,你所說的「服務」也是一個Spring bean,對吧?

你可能有它由春天增添了服務導致它有一些額外的功能(可能是事務管理),根據您的配置。

JSF的IoC容器是非常簡單的,它不會允許您配置其生命週期,包括交易管理,AOP之類的東西。那些你需要用Spring(或者Java,在Java EE環境中)做的事情。

因此,使用JSF與Spring的時候,你通常有兩種選擇:

  1. 要麼你把在JSF容器中的JSF頁面的支持豆,用@ManagedBean註解它們,@RequestScoped@ViewScoped等;並在屬性注入任何必要的Spring bean與@ManagedProperty(需要一個setter)
  2. 或者跳過JSF容器,把後盾豆在Spring容器中的所有其他人一樣,並使用請求/會話的春天範圍,註釋他們與Spring的註解@Component@Scope("request")@Scope("session")@Autowired@Qualifier等的注入。

就我個人而言,面對這樣的選擇,我會選擇第一選擇,因爲它給你@ViewScoped和其他一些細微之處。這是真的,它使用兩個IoC容器,但是,哪一個Java EE應用程序沒有?

如果你想反正走第二條路線,你也可能add a view scope for Spring beans, backed by JSF viewMap

+1

對於第一種選擇,「需要setter」是@ManagedProperty最重要的一點 –

2

什麼春所說的「服務」是Java EE方面的「EJB」。 EJB在Java EE Web配置文件容器(如Glassfish,JBossAS和TomEE)中可用。

要創建一個無狀態EJB的服務,只需要使用@Stateless的類:

@Stateless 
public class SomeService { 

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

} 

而且在JSF注入其管理的bean,只是對房地產將要注入的使用@EJB

@ManagedBean 
@ViewScoped 
public class SomeController { 

    @EJB 
    private SomeService service; 

} 

就是這樣。不需要getter/setter。沒有必要的XML樣板。