我想使用 Spring IoC 来连接我的服务 Bean。
在某些项目中,配置参数来自属性文件。
我希望使用与其他项目最相似的方法来实现这个新项目,这样 Spring XML 应用程序上下文就不会意识到配置参数现在来自 JMX 而不是文件系统中的属性文件。
我从 JBoss 中的 EJB 获取 JMX 配置参数,但我真的很想实现一个独立于服务器的解决方案,我可以在没有 JBoss 甚至没有 EJB 的情况下使用该解决方案。
我的想法示例:
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("/application-context.xml");
applicationContext.replacePropertiesConfigurer( myCustomPropertiesFromJMX );
applicationContext.reloadApplicationContext();
SomeBean aBean = (SomeBean) applicationContext.getBean("someBean");
当然,第二行和第三行是无效的,但它们是我想象我想要的解决方案的方式。
亲切的问候。
最佳答案
感谢Errandir寻求指导。
感谢Evgeniy Dorofeev也感谢他在另一个question中的回应也问了同样的问题。
适合我需要的最终代码如下:
在不工厂化 Spring beans 的情况下创建上下文(构造函数的第二个参数false):
ConfigurableApplicationContext applicationContext = new ClassPathXmlApplicationContext(new String[]{"classpath:main-applicationContext.xml"}, false);
创建属性,无论它们来自何处:
Properties jmxConfig = new Properties();
jmxConfig.setProperty("parameterX", valueX);
以编程方式创建 PropertiesPlaceholderConfigurer 并绑定(bind)我们刚刚创建的先前自定义属性,并将其绑定(bind)到应用程序上下文:
PropertySourcesPlaceholderConfigurer mapPropertySource = new PropertySourcesPlaceholderConfigurer();
mapPropertySource.setProperties(jmxConfig);
applicationContext.addBeanFactoryPostProcessor(mapPropertySource);
最后,它已配置完毕,现在可以创建实例并获取它们了:
applicationContext.refresh();
MyService myService = applicationContext.getBean("myService", MyService.class);
关于java - 如何将 JMX 参数传递到 Spring 应用程序上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19323618/