0

我的应用程序接收消息,提取数据并将提取的数据保存到数据库。数据通过Apache Camel通道接收,添加到FIFO中。以下代码从FIFO中接收下一条消息并对其进行处理。然而,为了做到这一点,需要从Spring应用程序上下文获得一个bean:如何避免从上下文中检索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

注入豆到您的骆驼狂胜建设者或处理器或什么的。一切都停止使用静态方法。 –

+0

好的 - 我对Ioc相当陌生。 1)静态方法有什么问题? (我想在这里学习)2)我不确定如何注入bean。我添加了从FIFO中读取的代码(该代码在与写入FIFO的Camel代码不同的线程中运行) – skyman

回答

相关问题