我有一个包含在EAR中的应用程序,其中包含许多JAR(包含EJB,库,第三方库,......)和单个WAR(同样包含其他一些JAR)。该应用程序部署在JEE7容器(Wildfly 8.0.0.Final)中,并使用CDI(Wildfly随附Wildd 2.1.2.Final)。
根据我的理解,Weld在应用程序范围内是活跃的,并且具有单一的应用程序范围视图。所以我想在哪里使用CDI并不重要 - 它有效。
但是有一些迹象表明这种情况并非如此。例如。 toString
的{{1}} - 方法在不同模块中显示不同的输出:
在我获得的战争中打包的某个模块中使用BeanManager
时
BeanManager
。
如果它在直接包含在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]
是"负责"应用程序的不同部分。这是真的吗?
答案 0 :(得分:4)
这由理解EAR规范的应用服务器处理。
来自维基百科:
大多数应用程序服务器都将已部署的EAR文件中的类加载为 孤立的Java类加载器树,隔离应用程序 其他应用程序,但在已部署的模块之间共享类对于 例如,部署的WAR文件将能够创建实例 JAR文件中定义的类,也包含在包含中 EAR文件,但不一定是其他EAR文件中JAR文件中的文件。 这种行为的一个关键原因是允许完全分离 在使用静态单例(例如Log4J)的应用程序之间 否则会混淆单独的配置 应用。这也可以实现不同版本的应用程序和 图书馆将并排部署。
因此,每个模块都有自己的BeanManager
,而应用程序服务器则管理这些实例之间的依赖关系。