?
? ????? PHP ??? ???? ??? ?? ??
對于每個Bean的注冊,MBeanExporter
在后臺委派給了 ObjectNamingStrategy
的一個實現(xiàn)來獲取 ObjectName
。
缺省實現(xiàn)是 KeyNamingStrategy
,它將默認(rèn)使用 beans
上 Map
的鍵值作為 ObjectName
。
此外,KeyNamingStrategy
可以將該鍵值與 Properties
文件中的一個條目對應(yīng),以此解析 ObjectName
。
除了 KeyNamingStrategy
之外,Spring還提供了另外兩個 ObjectNamingStrategy
的實現(xiàn):
基于bean的JVM標(biāo)識構(gòu)建 ObjectName
的 IdentityNamingStrategy
;
利用源代碼級元數(shù)據(jù)獲取 ObjectName
的 MetadataNamingStrategy
。
你可以配置你自己的 KeyNamingStrategy
實例,配置它從一個 Properties
實例讀取 ObjectName
,而不是用Bean的鍵值。
KeyNamingStrategy
首先會用bean的鍵值試圖從 Properties
中定位一個條目。
假若沒有找不到對應(yīng)的條目,或者 Properties
實例為 null
,最后才使用Bean的鍵值作為 ObjectName
。
以下代碼顯示了關(guān)于KeyNamingStrategy
的一份配置樣例:
<beans> <bean id="exporter" class="org.springframework.jmx.export.MBeanExporter"> <property name="beans"> <map> <entry key="testBean" value-ref="testBean"/> </map> </property> <property name="namingStrategy" ref="namingStrategy"/> </bean> <bean id="testBean" class="org.springframework.jmx.JmxTestBean"> <property name="name" value="TEST"/> <property name="age" value="100"/> </bean> <bean id="namingStrategy" class="org.springframework.jmx.export.naming.KeyNamingStrategy"> <property name="mappings"> <props> <prop key="testBean">bean:name=testBean1</prop> </props> </property> <property name="mappingLocations"> <value>names1.properties,names2.properties</value> </property> </bean </beans>
這個 KeyNamingStrategy
實例配置了一個 Properties
實例,而這個 Properties
實例由mapping屬性和mappingLocations屬性所指定的路徑定位到的 Properties
文件合成。
在這個配置里,由于 Properties
實例有個鍵值對應(yīng)該Bean的鍵值,因此 testBean
的 ObjectName
將被指定為 bean:name=testBean1
。
假若沒有任何條目可以從 Properties
實例找到,Bean的鍵值將會作為 ObjectName
。
MetadataNamingStrategy
用每個Bean上 ManagedResource
屬性的 objectName
屬性來構(gòu)建 objectName
。
以下代碼展示了對于 MetadataNamingStrategy
的配置:
<beans> <bean id="exporter" class="org.springframework.jmx.export.MBeanExporter"> <property name="beans"> <map> <entry key="testBean" value-ref="testBean"/> </map> </property> <property name="namingStrategy" ref="namingStrategy"/> </bean> <bean id="testBean" class="org.springframework.jmx.JmxTestBean"> <property name="name" value="TEST"/> <property name="age" value="100"/> </bean> <bean id="namingStrategy" class="org.springframework.jmx.export.naming.MetadataNamingStrategy"> <property name="attributeSource" ref="attributeSource"/> </bean> <bean id="attributeSource" class="org.springframework.jmx.export.metadata.AttributesJmxAttributeSource"/> </beans>
假若沒有 objectName
在 ManagedResource
里提供,那么一個 ObjectName
將以以下格式創(chuàng)建:
[fully-qualified-package-name]:type=[short-classname],name=[bean-name]。
例如,對于以下的Bean,產(chǎn)生的 ObjectName
將是 com.foo:type=MyClass,name=myBean。
<bean id="myBean" class="com.foo.MyClass"/>
如果你至少在使用Java 5,那么就可以使用一個方便的 MBeanExporter
子類, AnnotationMBeanExporter
。
當(dāng)定義一個這個子類的實例時,由于他將始終使用基于注解的標(biāo)準(zhǔn)Java元數(shù)據(jù)(自動探測也將始終被激活),namingStrategy
和 attributeSource
的配置也不再需要了。
<context:mbean-export/>
必要時,你可以提供某個MBean服務(wù)器的引用,同時 defaultDomain
屬性
(AnnotationMBeanExporter
的一個屬性)接受產(chǎn)生的MBean
ObjectNames
域名的替代值。
這被用于替代前面章節(jié) MetadataNamingStrategy
提及的完整限定包名。
<context:mbean-export server="myMBeanServer" default-domain="myDomain"/>.