Java EJB/MDB应用程序中的DI

Java EJB/MDB应用程序中的DI,java,dependency-injection,websphere-7,message-driven-bean,Java,Dependency Injection,Websphere 7,Message Driven Bean,我目前正在开发一个运行在IBMWebSphereApplicationServer7(JavaEE5)上的小型EJB应用程序。该应用程序主要由一个MDB组成,用于侦听传入的MQ消息,这些消息被转换并存储在DB中。目前,我正在使用许多单例/工厂来共享配置、映射、数据源查找等,但这实际上会导致一些非常难以测试的代码。解决方案可能是使用(简单的)DI框架,如guice/spring来注入不同的实例。问题是:在哪里放置初始化/设置代码?应用程序的主要入口点在哪里?如何将实例注入MDB?使用Spring,

我目前正在开发一个运行在IBMWebSphereApplicationServer7(JavaEE5)上的小型EJB应用程序。该应用程序主要由一个MDB组成,用于侦听传入的MQ消息,这些消息被转换并存储在DB中。目前,我正在使用许多单例/工厂来共享配置、映射、数据源查找等,但这实际上会导致一些非常难以测试的代码。解决方案可能是使用(简单的)DI框架,如guice/spring来注入不同的实例。问题是:在哪里放置初始化/设置代码?应用程序的主要入口点在哪里?如何将实例注入MDB?

使用Spring,您可以通过EJB3拦截器来实现,请参阅


javadoc中提供了有关注意事项的有用信息,请务必阅读它:

可能值得一看,放弃使用Guice,并尝试使用javaee5中已有的注入机制

关于找到合适的“启动点”,不幸的是EJB规范没有定义一种在启动时运行bean的方法。但是,EE规范的web概要文件确实有一个—您可以向应用程序添加WAR,并设置servlet侦听器组件:


您可以将此设置为在容器(WebSphere)加载和启动应用程序时启动。不过要注意类加载器问题。

您好,谢谢您的建议。不幸的是,我正在使用Guice进行DI。但我也可以把拦截器给你。我试试看。。。这里的问题是,在哪里以及如何启动“单个”AppContext/注入器,以及如何在拦截器中访问它?一个单身汉@Ingo我自己也没有使用过Guice,但这里有一些帖子描述了如何使用(会话)bean作为Guice注入器的“持有者”:[,[,,[问题是JEE 5注入仅适用于EJB,而不适用于普通java类。关于启动点。是的,我认为可以使用ServletContextListener,但因为我没有web应用程序……因此创建一个Servlet就可以了?然而,我找到了一个至少适用于WebSphere的解决方案,使用StartupBeans和拦截器.但我还是觉得我得用“单身”要访问注入器…添加servlet实际上不会有太多工作,特别是因为您使用的是JEE 5。如果您认为使用StartupBeans更好,请继续,但通常我会劝阻人们不要使用专有扩展。当有一天您需要支持JBoss等时,您将需要重新设计。如果可能,请使用WAS8,它支持JEE6/EJB3.1,它定义了一个单例bean。+在拦截器的使用上,它们是游戏规则的改变者。令人遗憾的是,EJB规范花了这么长时间才包含它们。