隨后我們就能在任何業務方法中使用這個實例變量了。
Spring通過XML bean定義項來自動完成剩下的工作。
LocalStatelessSessionProxyFactoryBean是一個能被任何EJB使用的通用工廠bean。它創建的對象能自動被Spring轉換為MyComponent 類型。
<bean id="myComponent" class="org.springframework.ejb.access.LocalStatelessSessionProxyFactoryBean"> <property name="jndiName" value="myComponent" /> <property name="businessInterface" value="com.mycom.MyComponent" />
</bean>
<bean id="myController" class = "com.mycom.myController"> <property name="myComponent" ref="myComponent" />
</bean>
幕后發生了很多魔法般的事情,出于Spring AOP框架的謙虛,你沒有被強迫使用AOP概念來享受這結果!癿yComponent”bean定義建立了一個實現了業務方法接口的EJB代理。EJB本地home在啟動時被緩存,所以一般只需要一次JNDI查找。(也有對失敗時重試的支持,所以一次EJB重部署不會導致客戶端失敗。)EJB每次被調用時,代理調用本地EJB的create()方法并調用EJB的相應業務方法。
myController bean定義將控制類的myController 屬性設置到這個代理。
這個EJB訪問機制對應用程序代碼進行了大量簡化:
- Web層代碼沒有了對使用EJB的依賴。如果我們想要用一個POJO、模擬對象或其他測試樁來代替這個EJB引用,我們可以簡單地改變myComponent bean定義而不用修改一行Java 代碼。
- 我們沒有必要寫一行JNDI查找代碼或其他EJB組裝代碼來作為我們應用程序的一部分。
我們還能通過相似的org.springframework.ejb.access.SimpleRemoteStatelessSessionProxyFactoryBean工廠bean將相同的方法運用于遠程EJB。但是,要把一個遠程EJB業務方法接口的RemoteExceptions 隱藏起來卻是很棘手的。(如果你希望提供一個匹配EJB遠程接口但方法簽名中沒有“throws RemoteException”語句的客戶端服務接口,Spring確實能讓你辦到這點。)
測試
正如你所注意到的,我和其他Spring的開發者都是全面單元測試的忠實擁護者。我們相信框架經過徹底的單元測試是很重要的,而且框架設計的一個主要目的應該是使構建于框架之上的應用程序應該是易于進行單元測試的。
Spring自己有一個出色的單元測試包。我們發現這個項目的測試優先帶來的好處是實實在在的。例如,它使得一個國際化分布式開發團隊工作極富效率,而且用戶們評論CVS快照往往很穩定,用起來很安全。
我們相信構建在Spring上的應用程序測試很方便,有以下原因:
- IoC易于進行單元測試。
- 應用程序不包含那些一般很難測試的直接使用例如JNDI之類的J2EE服務的代碼。
- Spring的bean工廠或上下文能在容器外建立。
在容器外建立一個Spring的bean工廠為開發過程提供了有趣的選擇權。在幾個使用Spring的web 應用程序項目中,工作始于定義業務接口和在一個web 容器外進行它們的實現的集成測試。只有在業務功能徹底完成后,再在上面加薄薄一層提供web接口。從Spring 1.1 開始,Spring提供了對在部署環緊外進行集成測試的強大且獨特的支持。這并不是有意要作為單元測試或針對部署環境的測試的代替品。然而,這可以顯著提高生產力。
文章來源于領測軟件測試網 http://www.kjueaiud.com/