Handle scoped proxy properly in MBeanExporter

Previously, if a bean has a scoped proxy and is annotated to be exposed
to the JMX domain, both the scoped proxy and the target instance were
exposed in the JMX domain, resulting in a duplicate entries. Worse, if
such bean defines an explicit name, the application wouldn't start
because of a name conflict.

This commit deals explicitely with scoped proxy and make sure to only
expose the relevant bean.

Issue: SPR-12529
This commit is contained in:
Stephane Nicoll
2014-12-16 10:45:25 +01:00
parent 809ee0d350
commit cae217de94
3 changed files with 48 additions and 2 deletions

View File

@@ -29,6 +29,8 @@ import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableMBeanExport;
import org.springframework.context.annotation.Lazy;
import org.springframework.context.annotation.MBeanExportConfiguration;
import org.springframework.context.annotation.Scope;
import org.springframework.context.annotation.ScopedProxyMode;
import org.springframework.jmx.export.MBeanExporterTests;
import org.springframework.jmx.export.TestDynamicMBean;
import org.springframework.jmx.support.MBeanServerFactoryBean;
@@ -62,6 +64,20 @@ public class EnableMBeanExportConfigurationTests {
}
}
@Test
public void testOnlyTargetClassIsExposed() throws Exception {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(
ProxyConfiguration.class);
try {
MBeanServer server = (MBeanServer) ctx.getBean("server");
ObjectName oname = ObjectNameManager.getInstance("bean:name=testBean4");
assertNotNull(server.getObjectInstance(oname));
assertEquals("TEST", server.getAttribute(oname, "Name"));
} finally {
ctx.close();
}
}
@Test
public void testPlaceholderBased() throws Exception {
MockEnvironment env = new MockEnvironment();
@@ -151,6 +167,26 @@ public class EnableMBeanExportConfigurationTests {
}
}
@Configuration
@EnableMBeanExport(server = "server")
static class ProxyConfiguration {
@Bean
public MBeanServerFactoryBean server() throws Exception {
return new MBeanServerFactoryBean();
}
@Bean
@Lazy
@Scope(proxyMode = ScopedProxyMode.TARGET_CLASS)
public AnnotationTestBean testBean() {
AnnotationTestBean bean = new AnnotationTestBean();
bean.setName("TEST");
bean.setAge(100);
return bean;
}
}
@Configuration
@EnableMBeanExport(server = "${serverName}")