我的应用程序接收消息,提取数据并将提取的数据保存到数据库中。数据通过Apache Camel通道接收,添加到FIFO。以下代码从FIFO接收下一条消息并对其进行处理。但是,为了做到这一点,它需要从Spring应用程序上下文中获取一个bean:
private static void dispatch(Message msg) {
if (msg == null) {
return;
}
// TODO: This really violates IoC.
DomainObjectFactory factory = (DomainObjectFactory) ApplicationContextProvider.getApplicationContext().getBean("domainObjectFactoryBean", DomainObjectFactory.class);
// do something with message
这是服务类:
@Service
public class ApplicationContextProvider implements ApplicationContextAware {
private static final Logger log = LoggerFactory.getLogger(ApplicationContextProvider.class);
private static ApplicationContext ctx = null;
public static ApplicationContext getApplicationContext() {
return getCtx();
}
@Override
public void setApplicationContext(ApplicationContext ctx) throws BeansException {
log.debug("Loading context");
ApplicationContextProvider.setCtx(ctx);
}
public static ApplicationContext getCtx() {
return ctx;
}
public static void setCtx(ApplicationContext ctx) {
ApplicationContextProvider.ctx = ctx;
}
}
从FIFO中读取消息:
void process(Object obj) {
Message msg = (Message) obj;
try {
Dispatcher.process(msg);
} catch (Exception e) {
e.printStackTrace();
}
}
这是非常弱的代码,但我无法解决如何避免它?这就是如何使用Spring IoC将消息从FIFO移除到消息处理,而无需从上下文中检索bean。
任何建议/指导意见
答案 0 :(得分:1)
当然,如果您使用注释或基于xml的注入,您的代码看起来会更好。如果您的dispatch
方法不是静态的,这会更容易。您仍然可以使用MethodInvokingFactoryBean
将Spring bean注入静态字段。在这里查看更多信息:
How can I inject local variables of a static method inside an abstract class using Spring?