如何将JMX参数传递给Spring应用程序上下文

时间:2013-10-11 17:06:07

标签: java spring

我想使用Spring IoC来连接我的服务bean。

在某些项目中,配置参数来自属性文件。

我希望用尽可能最相似的方法实现这个新项目,因此Spring XML应用程序上下文不知道现在配置参数来自JMX而不是文件系统中的属性文件。 / p>

我从JBoss的EJB中获取JMX configuarion参数,但我真的想实现一个独立于服务器的解决方案,我可以在没有JBoss的情况下使用,甚至不使用EJB。

我想到的例子:

ApplicationContext applicationContext = new ClassPathXmlApplicationContext("/application-context.xml");

applicationContext.replacePropertiesConfigurer( myCustomPropertiesFromJMX );
applicationContext.reloadApplicationContext();

SomeBean aBean = (SomeBean) applicationContext.getBean("someBean");

当然,第二行和第三行无效,但它们是我想象的理想解决方案。

亲切的问候。

2 个答案:

答案 0 :(得分:2)

感谢Errandir提供了指导。

感谢Evgeniy Dorofeev他在另一个question提出同样问题的答复。

接下来是符合我需求的最终代码:

创建上下文而不需要生成Spring bean( false 构造函数的第二个参数):

ConfigurableApplicationContext applicationContext = new ClassPathXmlApplicationContext(new String[]{"classpath:main-applicationContext.xml"}, false);

在任何地方创建属性:

Properties jmxConfig = new Properties();
jmxConfig.setProperty("parameterX", valueX);

以编程方式创建一个PropertiesPlaceholderConfigurer并绑定我们刚创建的先前自定义属性并将其绑定到应用程序上下文:

PropertySourcesPlaceholderConfigurer mapPropertySource = new PropertySourcesPlaceholderConfigurer();
mapPropertySource.setProperties(jmxConfig);
applicationContext.addBeanFactoryPostProcessor(mapPropertySource);

最后,它已配置好,现在可以创建实例并获取它们:

applicationContext.refresh();

MyService myService = applicationContext.getBean("myService", MyService.class);

答案 1 :(得分:1)

如果您使用的是Spring 3.1.x,则必须实现PropertySource,它将从您想要的任何地方获取属性。然后将其添加到您的应用程序环境中:

ConfigurableApplicationContext applicationContext
        = new ClassPathXmlApplicationContext("/application-context.xml");

PropertySource myPropertySource = new SomeImplementationOfPropertySource();
applicationContext.getEnvironment().getPropertySources().addFirst(myPropertySource);

我希望我的问题是对的。