随后我们就能在任何业务方法中使用这个实例变量了。
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概念来享受这结果。“myComponent”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提供了对在部署环紧外进行集成测试的强大且独特的支持。这并不是有意要作为单元测试或针对部署环境的测试的代替品。然而,这可以显著提高生产力。
文章来源于领测软件测试网 https://www.ltesting.net/