如何避免从上下文中检索Spring托管bean

时间:2015-05-04 11:14:43

标签: spring dependency-injection apache-camel inversion-of-control

我的应用程序接收消息,提取数据并将提取的数据保存到数据库中。数据通过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。

任何建议/指导意见

1 个答案:

答案 0 :(得分:1)

当然,如果您使用注释或基于xml的注入,您的代码看起来会更好。如果您的dispatch方法不是静态的,这会更容易。您仍然可以使用MethodInvokingFactoryBean将Spring bean注入静态字段。在这里查看更多信息:

How can I inject local variables of a static method inside an abstract class using Spring?