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

MrD*_*MrD 7 java cdi weld

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

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

但有一些迹象表明这种情况并非如此.例如,toString所述的-method BeanManager的节目在不同的模块不同的输出:

BeanManager我在战争中打包的某个模块中使用时,我得到了 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].

如果它在EAR中直接包含的库中使用: Weld BeanManager for test-ear-1.0-SNAPSHOT.ear/test-ejb3-dao-1.0-SNAPSHOT.jar/ [bean count=224].

所以它们似乎BeanManagers"负责"应用程序的不同部分.这是真的?

tho*_*ens 4

这实际上是由理解 EAR 规范的应用程序服务器来处理的。

来自维基百科:

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

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