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