了解多模块应用程序中的CDI / Weld

时间:2014-04-02 09:41:55

标签: java cdi weld

我有一个包含在EAR中的应用程序,其中包含许多JAR(包含EJB,库,第三方库,......)和单个WAR(同样包含其他一些JAR)。该应用程序部署在JEE7容器(Wildfly 8.0.0.Final)中,并使用CDI(Wildfly随附Wildd 2.1.2.Final)。

根据我的理解,Weld在应用程序范围内是活跃的,并且具有单一的应用程序范围视图。所以我想在哪里使用CDI并不重要 - 它有效。

但是有一些迹象表明这种情况并非如此。例如。 toString的{​​{1}} - 方法在不同模块中显示不同的输出:

在我获得的战争中打包的某个模块中使用BeanManagerBeanManager

如果它在直接包含在EAR中的库中使用: Weld BeanManager for test-ear-1.0-SNAPSHOT.ear/test-webui-frontend-1.0-SNAPSHOT.war/WEB-INF/lib/test-webui-backend-1.0-SNAPSHOT.jar [bean count=76]

所以似乎这些Weld BeanManager for test-ear-1.0-SNAPSHOT.ear/test-ejb3-dao-1.0-SNAPSHOT.jar/ [bean count=224]是"负责"应用程序的不同部分。这是真的吗?

1 个答案:

答案 0 :(得分:4)

这由理解EAR规范的应用服务器处理。

来自维基百科:

  

大多数应用程序服务器都将已部署的EAR文件中的类加载为   孤立的Java类加载器树,隔离应用程序   其他应用程序,但在已部署的模块之间共享类对于   例如,部署的WAR文件将能够创建实例   JAR文件中定义的类,也包含在包含中   EAR文件,但不一定是其他EAR文件中JAR文件中的文件。   这种行为的一个关键原因是允许完全分离   在使用静态单例(例如Log4J)的应用程序之间   否则会混淆单独的配置   应用。这也可以实现不同版本的应用程序和   图书馆将并排部署。

因此,每个模块都有自己的BeanManager,而应用程序服务器则管理这些实例之间的依赖关系。