Bean の ObjectName インスタンスの制御

バックグラウンドでは、MBeanExporter は ObjectNamingStrategy の実装に委譲して、登録する各 Bean の ObjectName インスタンスを取得します。デフォルトでは、デフォルトの実装である KeyNamingStrategy は、beansMap のキーを ObjectName として使用します。さらに、KeyNamingStrategy は、beansMap のキーを Properties ファイル(または複数のファイル)のエントリにマップして、ObjectName を解決することができます。KeyNamingStrategy に加えて、Spring は 2 つの追加の ObjectNamingStrategy 実装を提供します。IdentityNamingStrategy (Bean の JVM ID に基づいて ObjectName を構築します)と MetadataNamingStrategy (ソースレベルのメタデータを使用して ObjectName を取得します)です。

プロパティからの ObjectName インスタンスの読み取り

独自の KeyNamingStrategy インスタンスを構成し、Bean キーを使用するのではなく、Properties インスタンスから ObjectName インスタンスを読み取るように構成できます。KeyNamingStrategy は、Bean キーに対応するキーを使用して、Properties のエントリを見つけようとします。エントリが見つからない場合、または Properties インスタンスが null の場合、Bean キー自体が使用されます。

次のコードは、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 インスタンスで構成します。この構成では、Bean キーに対応するキーを持つ Properties インスタンスのエントリであるため、testBean Bean には bean:name=testBean1 の ObjectName が与えられます。

Properties インスタンスにエントリが見つからない場合、Bean キー名が ObjectName として使用されます。

MetadataNamingStrategy を使用する

MetadataNamingStrategy は、各 Bean の ManagedResource 属性の objectName プロパティを使用して、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.annotation.AnnotationJmxAttributeSource"/>

</beans>

objectName が ManagedResource 属性に提供されていない場合、ObjectName は次の形式で作成されます: [ 完全修飾パッケージ名 ]:type = [short-classname]、name = [bean-name] 例: 次の Bean に対して生成される ObjectName は com.example:type=MyClass,name=myBean になります。

<bean id="myBean" class="com.example.MyClass"/>

アノテーションベースの MBean エクスポートの構成

アノテーションベースのアプローチを使用して管理インターフェースを定義する場合は、MBeanExporter の便利なサブクラス AnnotationMBeanExporter を使用できます。このサブクラスのインスタンスを定義する場合、namingStrategyassemblerattributeSource 構成は常に標準の Java アノテーションベースのメタデータを使用するため、必要ありません(自動検出も常に有効になっています)。実際、次の例に示すように、MBeanExporter Bean を定義するのではなく、さらに単純な構文が @EnableMBeanExport@Configuration アノテーションによってサポートされています。

@Configuration
@EnableMBeanExport
public class AppConfig {

}

XML ベースの構成を好む場合、<context:mbean-export/> 要素は同じ目的を果たし、次のリストに表示されます。

<context:mbean-export/>

必要に応じて、特定の MBean server への参照を提供できます。defaultDomain 属性(AnnotationMBeanExporter のプロパティ)は、生成された MBean ObjectName ドメインの代替値を受け入れます。これは、次の例に示すように、前の MetadataNamingStrategy セクションで説明したように、完全修飾パッケージ名の代わりに使用されます。

@EnableMBeanExport(server="myMBeanServer", defaultDomain="myDomain")
@Configuration
ContextConfiguration {

}

次の例は、前述のアノテーションベースの例に相当する XML を示しています。

<context:mbean-export server="myMBeanServer" default-domain="myDomain"/>
Bean クラスで JMX アノテーションの自動検出と組み合わせてインターフェースベースの AOP プロキシを使用しないでください。インターフェースベースのプロキシは、ターゲットクラスを「非表示」にします。これにより、JMX 管理のリソースアノテーションも非表示になります。その場合はターゲットクラスプロキシを使用する必要があります(<aop:config/><tx:annotation-driven/> などで "proxy-target-class" フラグを設定することにより)。そうしないと、JMXBean が起動時にサイレントに無視される可能性があります。