Bean の ObjectName
インスタンスの制御
バックグラウンドでは、MBeanExporter
は ObjectNamingStrategy
の実装に委譲して、登録する各 Bean の ObjectName
インスタンスを取得します。デフォルトでは、デフォルトの実装である KeyNamingStrategy
は、beans
Map
のキーを ObjectName
として使用します。さらに、KeyNamingStrategy
は、beans
Map
のキーを 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
を使用できます。このサブクラスのインスタンスを定義する場合、namingStrategy
、assembler
、attributeSource
構成は常に標準の 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 が起動時にサイレントに無視される可能性があります。 |