4

我目前正在开发在IBM Websphere Application Server 7(Java EE 5)上运行的小型EJB应用程序。该应用程序主要由一个MDB组成,用于监听传入的MQ消息并将其转换并存储在数据库中。目前我正在使用大量的Singleton/Factories来共享配置,映射,数据源查找等。但是这实际上导致了一些非常难以测试的代码。解决方案可能使用像guice/spring这样的(简单)DI框架来注入不同的实例。问题是:在哪里放置初始化/设置代码?应用程序的主要入口在哪里?我怎样才能将实例注入MDB?在EJB/MDB应用程序中的DI

回答

1
+0

嗨,谢谢你的建议。不幸的是,我正在使用Guice作为DI。但是我也可以让你的拦截器。我会尝试...这里的问题,在哪里以及如何启动“单个”AppContext/Injector以及如何在拦截器中访问它?由一个单身?? – Ingo 2011-07-14 14:39:02

+0

@Ingo我自己并没有使用Guice,但这里有一些帖子描述了使用(session)bean作为Guice注入器'持有者':[http://attias.myftp.org/attias/index.php/Guice_and_EJB ],[http://musingsofaprogrammingaddict.blogspot.com/2009/03/guice-tutorial-part-3-integrating-guice.html],[http://a-developer-life.blogspot.com/2010/11 /injecting-into-ejb3-with-google-guice.html] – francisnovilla 2011-07-19 10:27:04

2

它可能是值得考虑的,从釜底抽薪使用Guice,并尝试使用Java EE 5中已有的注入机制。

关于寻找合适的“启动点”,不幸的是,EJB规范没有定义在启动时可以运行bean的方式。然而,EE规范的Web Profile中确实有一个 - 你可以一个WAR添加到您的应用程序,并设置一个servlet侦听器组件:

http://java.sun.com/javaee/5/docs/api/javax/servlet/ServletContextListener.html

您可以将其设置为启动时加载应用程序并由容器(WebSphere)启动。不过要注意classloader问题。

+0

问题是,JEE 5注入只适用于EJB,而不适用于纯java类。关于启动点。是的,我认为可以使用ServletContextListener,但由于我没有一个Web应用程序......为此创建一个Servlet?不过,我至少为WebSphere找到了一个解决方案,使用StartupBeans和Interceptors。但是,我仍然认为我必须使用“Singleton”来访问Injector ... – Ingo 2011-09-09 10:04:26

+0

添加一个servlet并不会真的有太多的工作,特别是因为你在JEE 5上。如果你认为你是使用StartupBeans更好,继续,但通常我会试图阻止人们使用专有扩展。如果有一天你最终需要支持JBoss等等,你将需要重新设计。如果可能的话,使用WAS8,它支持JEE6/EJB3.1,它定义了一个单例bean。 – Renan 2011-09-10 02:43:18

+0

+对拦截器的使用,他们是一个游戏改变者。所以EJB规范花了很长时间来包含它们,真让人伤心。 – Renan 2011-09-10 02:44:29

相关问题