WebLogic Server上的Spring非常好的实践
比较了J2EE和Spring环境中的MedRec架构之后,现在,我们要介绍一些在实现MedRec-Spring应用程序的过程中,我们所发现的一些宝贵经验:
使用延迟初始化。为了实现IoC容器,Spring加载了一个application context文件,并创建和缓存了每个已配置bean的实例.Spring bean引用的每项资源都必须可以实例化或查找,了解这一点很重要。例如,Spring的JMX支持提供到WebLogic Server的MBean服务器的连接。因为并非所有的MBean服务器都是在部署期间激活的,所以用户应该在部署资源时,一启动就使用Spring的延迟初始化和查找服务。
基于功能分离出Spring配置。这允许应用程序组件只加载那些与它们的工作职责有关的上下文。在实践上还允许测试人员修改应用程序的行为,具体方法是使用特定于测试环境的上下文来替换应用程序上下文?D?D例如DataSource配置。
通过JndiObjectFactoryBean封装JDBC DataSource连接入池。然后,需要数据库交互的bean可以引用这个bean,以便利用WebLogic Server的DataSource入池功能。
对会话和消息驱动Enterprise JavaBean使用Spring的org.springframework.ejb.support。Spring的org.springframework.ejb.support提供Enterprise JavaBeans (EJB)可以对其进行扩展的抽象类。通过把EJB生命周期方法的标准实现包括进来,这些抽象EJB类可以辅助开发工作。更重要的是,这些类提供了加载Spring的应用程序上下文的机制,包括跨多个EJB和客户端共享上下文,因此减少了EJB初始化期间的复制工作和负载。
利用热部署和WebLogic Server的拆分开发目录环境。这极大地改善了集成测试期间的Spring开发体验。热部署允许在不重新启动服务器的情况下重新加载应用程序。拆分目录开发环境通过尽量减少不必要的文件复制,支持更快的开发和部署。拆分开发目录Ant任务可以帮助用户快速重新编译和重新部署,无需首先生成可部署的存档文件或展开的存档目录。
把Spring库打包为应用程序库、可选扩展或服务器扩展。这允许几个Spring应用程序共享Spring Framework,从而减少了应用程序所占用的内存。除了降低内存占用量外,这还提高了部署次数。
Spring on WebLogic Server工具包
为了帮助客户使部署在WebLogic Server上的Spring应用程序发挥最大的功效,我们已经发布了一个经过认证的BEA发行版,其中包括Spring 1.2.5、MedRec on Spring应用程序以及其他的一些很不错的工具。您可以从BEA的发行版Web站点上免费下载这个工具包。
企业Spring
Spring Framework的非侵入性IoC开发模型不但依赖于对J2EE应用服务器可用的特性集,而且旨在补充该特性集。事实上,在苛刻的生产环境中,底层应用服务器基础架构所提供的服务质量对于Spring应用程序的可靠性、可用性和性能非常重要。WebLogic Server 9.0所提供的企业级特性可以增强Spring应用程序的所有方面。在本节中,我们将详细讨论这些特性,以及如何在Spring应用程序中利用它们。
集群管理和部署
一个WebLogic Server集群包括多个WebLogic Server服务器实例,这些服务器实例同时运行并一起工作,从而提高了可伸缩性和可靠性。对客户端来说,集群就像单个的WebLogic Server实例一样。构成集群的服务器实例既可以运行在同一台机器上,也可以位于不同的机器上。可以通过在现有的机器上向集群添加另外的服务器实例,或者向集群添加机器以驻留增加的服务器实例,来提高集群的容量。WebLogic Server集群为Spring应用程序提供了一个企业级的部署平台,虽然其他的技术产品也支持类似的特性,但是它们不具有WebLogic Server所提供的丰富性和易用性。参见Understanding Cluster Configuration and Application Deployment,其中有对WebLogic Server集群的配置和管理的全面讨论。
Spring应用程序通常都被打包为web应用程序,这种情况下,要利用WebLogic Server集群就无需修改应用程序。只要把应用程序部署到集群中的服务器上,就可以获得增强的可伸缩性和可用性。
Spring会话复制
Spring Web应用程序习惯在HTTP会话中保存信息,比如订单ID和用户信息。为了支持集群中servlet和JSP的自动复制和故障恢复,WebLogic Server支持几种用于保持HTTP会话状态的机制。只要为应用程序提供正确的weblogic.xml部署描述符,Spring Web应用程序就可以非侵入性地使用这些机制。参见配置各类会话持久性,可以获得有关WebLogic Server 9.0的更多可用信息。
集群化的Spring远程控制
Spring提供功能强大的远程控制支持,允许用户轻松导出和使用远程服务,同时仍然可以利用基于POJO的一致编程模型。通过一个接合到适当的Spring bean的RMI接口,Vanilla Spring支持代理POJO调用。然而,这种支持仅限于JRMP(Sun的RMI实现),或者通过JndiRmiProxyFactoryBean使用特定的远程接口。借助于Spring 1.2.5 on WebLogic Server 9.0认证,我们已经扩展了JndiRmiProxyFactoryBean和相关的服务导出程序?D?D这样它就能支持任何J2EE RMI实现的POJO代理,包括RMI-IIOP和T3。这方面的支持还包括一个WebLogic RMI部署描述符,它支持代理RMI接口上的集群化,所以POJO调用可以跨一个WebLogic Server集群进行负载均衡:
<bean id="proProxy" class="org.springframework.remoting.rmi.JndiRmiProxyFactoryBean"> <property name="jndiName" value="t3://:/order"/> </property> <property name="jndiEnvironment"> <props> <prop key="java.naming.factory.url.pkgs"> weblogic.jndi.factories </prop> </props> </property> <property name="serviceInterface" value="org.springframework.samples.jpetstore.domain.logic.OrderService"/></bean>服务导出程序如下:<bean id="order-pro" class="org.springframework.remoting.rmi.JndiRmiServiceExporter"> <property name="service" ref="petStore"/> <property name="serviceInterface" value="org.springframework.samples.jpetstore.domain.logic.OrderService"/> <property name="jndiName" value="order"/></bean>
集群化的描述符是自动包含在内的,只需要以适当方式配置集群和将Spring应用程序部署到所有集群成员中。参见故障恢复支持,可以获得更多相关信息。
对Spring组件的控制台支持
Spring on WebLogic Server工具包中包含一个WebLogic Server控制台扩展,它显示了定义在应用程序中的Spring bean、属性和操作。它构建在WebLogic控制台扩展门户框架之上,该框架可以变换WebLogic Administration控制台的外观、功能和布局,而无需修改服务器或控制台代码。将控制台扩展复制到yourdomain/console-ext目录下,则重新启动服务器时就部署了控制台扩展。想要了解有关部署控制台扩展的更多信息,可以参考Spring on WebLogic Server工具包。
自动为不是MBean的Spring bean(大多数Spring bean)创建(JMX)管理接口,然后在applicationContext.xml中配置一个MbeanExporter,并指定哪些bean要通过汇编程序公开,这样控制台扩展就运行了。这项特性是Spring和WebLogic Server进行无缝和非侵入性合作的一个良好例证。要使应用程序支持JMX,只需修改应用程序上下文部署描述符。要使控制台支持Spring,只需将一个简单的jar部署到现有的域即可。