Jakarta ee 在多模块项目中放置所有注释和CDIBean的正确位置

Jakarta ee 在多模块项目中放置所有注释和CDIBean的正确位置,jakarta-ee,dependency-injection,cdi,Jakarta Ee,Dependency Injection,Cdi,我有一个带有5个maven模块的企业应用程序(通用Jar、EJB、WEB、EAR、GAR) beans.xml文件位于Web模块\webapp\Web-INF下,我使用此代码列出所有发现的bean: Set<Bean<?>> beans = beanManager.getBeans(Object.class, new AnnotationLiteral<Any>() { }); for (Bean<?> bean : beans) { Sy

我有一个带有5个maven模块的企业应用程序(通用Jar、EJB、WEB、EAR、GAR)
beans.xml
文件位于
Web模块\webapp\Web-INF
下,我使用此代码列出所有发现的bean:

Set<Bean<?>> beans = beanManager.getBeans(Object.class, new AnnotationLiteral<Any>() {
});
for (Bean<?> bean : beans) {
    System.out.println(bean.getBeanClass().getName());
}
Set
问题1:发现的bean是否有任何例外或限制

是的,事实上很多。欢迎来到JavaEE。这一切都是由JavaEE“伞形”规范强制执行的,CDI规范必须遵守该规范。例如,WAR可以看到EJBJAR,但反之亦然,所以这将转化为bean注入。而且。EE雨伞规格在很多方面都不太清楚,所以不同的AS(野蝇、玻璃鱼等)的行为可能略有不同

问题2:在多模块项目中放置所有注释和CDIBean的正确位置是什么

再次不是一件简单的事情来回答;根据可见性规则,您需要决定是否关心哪些部署将看到哪些bean。然后,您可以在不同的战争中使用相同基本bean类型的不同备选方案,等等。如果您想从所有部署的归档文件中访问所有内容,那么
EAR/lib
可能就是这个地方(注意:并不意味着共享bean)

大多数项目选择对此进行细化,并将bean放入需要它的归档中。如果有更多存档需要它们,请将其提取(根据可见性规则)到一个从所有需要的位置可见的存档中(
EAR/lib
是最后的选择)

还要注意的是,如果您想在多个归档文件中启用CDI(不是在所有归档文件中,而是为了简化,如果您将其放在归档文件中,则肯定会启用),则可能需要在多个归档文件中使用
beans.xml


最后但并非最不重要的一点,由于可见性规则,
BeanManager
仅限于可访问的一组bean,您检索所有bean的代码可能无法正常工作(如您所料)。

感谢百万兄弟,这非常有用。@Mohsensabaghi很高兴我能提供帮助。如果它回答了问题,请将我的答案标记为正确(或他们怎么称呼它),这样它就不会一直打开。