我想使用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");
当然,第二行和第三行无效,但它们是我想象的理想解决方案。
亲切的问候。
答案 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);
我希望我的问题是对的。