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 被認為是最好的方法)配置類及它們的依靠性。然后用標準訪問器將引用“注入”到類所依靠的對象中??梢詫⑺闯删唧w化復合(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 固有的靈活性。