SPRing 框架将体系结构依靠性降至最低,并且将应用程序中得组成部分进行了具体化,但是应用程序仍然是需要治理的。幸运的是,Spring 1.2 包括高级的 JMX 集成支持,并且 JMX 为应用程序提供了一种实用的治理基础架构。在本文中,Claude Duguay 从 Spring JMX 更进一步,向您展示了如何为方法和属性透明地增加通知事件。最后得到的代码使您可以监视状态变化,同时不会搞乱 java? 对象。
虽然 Spring 框架的 JMX 治理基础架构的默认配置已经很不错了,但是仍然有定制的余地,非凡是涉及 Model MBean 提供的更高层功能时。在本文中,我使用了一种相对简单的操作 —— 为基于 Spring 的应用程序的方法和属性增加通知事件 —— 以帮助您熟悉对 Spring JMX 的定制。从头到尾完成我的例子后,您将可以根据自己应用程序的需要调整 Spring JMX 治理基础架构。
我首先对 JMX API、Spring 框架和 Spring JMX 进行简单回顾,然后转入开发扩展。第一个扩展让我可以用一个外部 xml 格式配置 MBean 元数据,这个格式(像 Hibernate 映射文件)可以与 Java 对象一起存储在类路径中。我的第二个扩展为 ModelMBean 类增加一个简单的命名规范,以透明地配置定制的通知消息。在属性改变时或者调用了特定的方法之前或者之后触发新的通知消息。
Model MBean 提供了一个改进的抽象层,并扩展了 Dynamic MBean 模型以进一步减少对给定实现的依靠性。这对于可能使用多个版本的 JVM 或者需要用松散耦合治理第三方类的情况会有帮助。Dynamic MBean 与 Model MBean 之间的主要区别是,在 Model MBean 中有额外的元数据。
Open MBean 是受限的 Model MBean,它限制类型为固定的一组类型,以得到最大的可移植性。通过限制数据类型,可以使用更多的适配器,并且像 SMTP 这样的技术可以更轻易适应 Java 应用程序的治理。这种变体还指定了数组和表等标准结构以改进复合对象的治理。
假如要同时控制客户机和服务器,那么 Standard MBean 是最轻易实现的一种变体。它们的优点是有类型,但是假如在更一般化的治理控制台环境中使用时会缺少一些灵活性。假如计划使用 Dynamic MBean,那么您也可以更一步使用 Model MBean,在大多数情况下它会改善抽象层而几乎不会增加复杂性。Open MBean 是是可移植性最高的一种变体,假如需要开放复合对象,那么它是惟一的方法。不幸的是,在 Open MBean 中开放复合结构所需要的代码数量过多,只有在需要高级的商业治理解决方案时才合算。
JMX 还支持使用带过滤器和广播器的事件模型的通知。为此目的,Standard MBean 需要声明一个 MBeanInfo 元数据描述。 Standard MBean 实现通常在内部构造这些内容,开发人员不能直接看到它们。在本文后面,您会看到如何用 Model MBean 元数据的 XML 描述符格式和 Spring 的 JMX 支持进行实际上透明的配置。
Spring 的支持 AOP 的、以复合为中心的(IOC)bean 可以很大程度上使基础架构和业务对象彼此分离。因此,横切关注点(如日志、事务和安全)不会再干扰应用程序代码。
IOC(控制反转)是减少耦合度的主要策略。Spring 的 IOC 实现使用依靠性注入有效地将控制从应用程序代码 “反转”到 Spring 容器。Spring 不是在创建时将类耦合到应用程序的对象图,它使您可以用 XML 或者属性文件(尽管 XML 被认为是最好的方法)配置类及它们的依靠性。然后用标准访问器将引用“注入”到类所依靠的对象中。可以将它看成具体化复合(externalizing composition),在典型应用程序中,它的比重远远大于继续。
AOP 是在应用程序开发中治理横切关注点的要害。就像在传统面向对象编程中实现的那样,这些关注点是作为单独的实例处理的,有可能在应用程序类中产生互不相关的代码(就是混乱)。 Spring 使用 AOP 规范和一个 XML 配置文件具体化横切关注点,因而保持了 Java 代码的纯洁性。
Spring 1.2 提供的大量装配器使得透明地构造 MBean 成为可能,包括使用内省、Standard MBean 接口、元数据(使用类级别注释)和显式声明的方法名。Spring 的基于导出器和装配器的模型轻易扩展,并在创建注册的 MBean 时提供所需要的控制能力。
JMX 使用 ObjectName 语言注册和访问治理对象。假如选择使用自动注册,那么 Spring 提供了不同的命名策略。使用“键”命名策略时,可以使用一个属性把 MBean 名与 NameObject 实例关联起来。假如实现 ManagedResource 接口,那么可以使用元数据命名规范。由于 Spring 高度灵活的体系结构和大量扩展点,还可以实现自已的策略。
在默认情况下,Spring 会发现运行的 MBeanServer 实例,假如没有实例在运行或者没有显式声明的话,它会创建一个默认实例。用 Spring 配置直接实例化自己的 MBeanServer 与使用各种连接器同样轻易。Spring 通过客户机和服务器连接提供控制,并提供客户机代理以协助客户端编程。
所有这些功能都是 Spring 1.2 默认提供的。虽然 Spring JMX 提供了大量选项,但是默认的导出器对于许多项目来说已经足够了,使您可以很快地投入运行。不过,使用 JMX 时,在使用隐式 MBean 构造时会注重到一些特性。结果,可能会慢慢地从 Standard MBean 转移到 Model MBean,它答应对应用程序的属性、操作和通知元数据施加更多的控制。要保留松散耦合的好处(也就是 Spring 灵活的体系结构内在的优点),需要在 Java 对象之外实现这个控制。
Spring 的 IOC 使得从外部连接(wire)对象依靠性轻易了,在 Spring 的体系结构中很轻易利用这种优点。IOC 保持对象依靠性的可注入性,这使得增加、替换或者补充对象的行为(包括 Spring 的 JMX 支持)变得轻而易举。在本文的其余部分,我将重点放到扩展 Spring JMX 以得到更细化的应用程序治理,而不会搞乱应用程序代码或者破坏 Spring 固有的灵活性。