2

我想使用 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");

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

亲切的问候。

4

2 回答 2

2

感谢Errandir的指导。

也感谢Evgeniy Dorofeev对另一个同样问题的回答。

接下来是适合我需要的最终代码:

在没有工厂化 Spring bean 的情况下创建上下文(构造函数的第二个参数):

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);
于 2013-10-18T16:16:22.117 回答
1

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

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

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

我希望我能正确回答您的问题。

于 2013-10-11T19:02:54.423 回答