0

我们正在将当前项目迁移到 Java EE 6(以后可能是 7),并在此过程中了解 Java EE 世界在过去 5 年中发生的事情。我们现在有组织和逻辑问题要解决。

我们创建了单独的实用程序库来处理 l10n、日期、货币转换等。这个库 (jar) 将在我们的本地 maven 存储库 (nexus) 上,其他项目和模块将在需要时使用它。

我们的部分团队成员喜欢(新的)管理的做事方式:

@Inject
DateFormatter df;

如果我们放入我们的库类@Singleton,我们就不必编写static数百次。

但是,团队的其他部分认为老派的方式是你这样做的方式:

...
DateFormatter df = new DateFormatter();
String localizedDate = df.localize('2013-10-01')
...

@Inject主要是因为它对于像 Regex、字符串实用程序和类似的实用程序类这样的东西似乎不自然,它们在整个服务类中不需要,只有在某些方法中才需要。

而且,当然,您似乎两者都可以做到,如果您尝试使用@Inject已经在其他地方通过 启动的同一类new,您将NullPointerException进入 JBOSS AS 7。

那么,我们应该怎么做呢?有没有办法让它同时使用两种方式,如果没有,你会推荐吗?

提前致谢!

4

2 回答 2

1

我真的建议您使用第一个选项,唯一的例外是我会创建该类@ApplicationScoped而不是@Singleton(就 CDI 而言,EJB 单例与锁定等更多功能有所不同)。几乎没有区别,但新的 CDI 规范甚至没有提到 CDI@Singleton范围,所以我猜它会被弃用,取而代之的是@ApplicationScoped.

有了这个,您不必一直创建实用程序类的新实例(或导入静态方法),但每个应用程序将有一个实例,因此它会为您提供更好的性能。此外,您的实用程序类可以从向其注入其他组件、拦截器和其他 CDI 内容中受益。现在您可能知道为什么不能同时使用这两种方式,如果您尝试调用new DateFormatter(),bean 将不再受容器管理(因此您最终将在您的应用程序中拥有更多实例),它只会把事情搞砸,所以坚持这是第一个解决方案,你会没事的:)

于 2013-11-01T20:16:04.033 回答
0

对于那些想继续以旧方式使用它的人(实例化,允许应用程序管理实例),保持原样。

对于那些想要使用新方法的人,在您的 JAR 文件之上添加一个生产者层。这可以是它自己的 JAR 文件,并且只是为这些不同的实用程序类提供产品。现在的权衡是双方都需要同意停止使用静态方法,或者如果他们想继续使用那些需要存在于自己的 JAR 中的静态方法,就像 CDI 附加组件的工作方式一样。

于 2013-11-03T20:53:52.677 回答