[英]what is the purpose of including empty beans.xml in CDI implemenations projects?
我在我的 JSF-EJB-JPA Web 應用程序中使用weld
,CDI 的一個 RI 作為依賴項注入組件。 我在我的項目中看到ejb.jar
中的META-INF/beans.xml
和 WAR 中的WEB-INF/beans.xml
中有空的 beans.xml。 我不明白為什么我們需要在該文件中沒有定義任何內容時保留空的beans.xml
?
CDI 需要在啟動時掃描 bean 存檔的所有類並觸發一系列事件,因為幾乎所有類都會自動成為托管 bean( 在此處閱讀更多內容),即使它沒有任何注釋。
這會產生相當多的開銷,尤其是對於不打算包含任何 bean 的 jar 文件,因此通過包含beans.xml
來明確指示應掃描哪些 bean 檔案是有益的。
一個完全空的beans.xml
與在存檔中有一個beans.xml
具有以下內容相同:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
bean-discovery-mode="all">
</beans>
由於bean-discovery-mode="all"將掃描存檔以查找 bean。 無需注釋它們。
一個不存在的beans.xml
它與在存檔中具有以下內容的beans.xml
相同:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
bean-discovery-mode="annotated">
</beans>
由於bean-discovery-mode="annotated"存檔將在被注釋的類中掃描 bean(例如@Dependent
)。 所有其他類將被忽略,因此不能作為 bean 注入。
第三個選項是聲明bean-discovery-mode="none"在這種情況下服務器從不掃描 bean 的存檔。
現在對於您想將類作為 bean 加載但無法訪問存檔(例如外部庫)並且類沒有注釋的情況,解決方案是使用Producer 方法(帶或不帶限定符)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.