簡體   English   中英

在 CDI 實現項目中包含空 beans.xml 的目的是什么?

[英]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 檔案是有益的。

1

一個完全空的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。 無需注釋它們。

2

一個不存在的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 注入。

3

第三個選項是聲明bean-discovery-mode="none"在這種情況下服務器從不掃描 bean 的存檔。

4

現在對於您想將類作為 bean 加載但無法訪問存檔(例如外部庫)並且類沒有注釋的情況,解決方案是使用Producer 方法(帶或不帶限定符)。

它在某些有限的情況下使用

http://docs.oracle.com/javaee/6/tutorial/doc/gjbnz.html

一些像裝飾器這樣的 CDI 特性會在這個文件中聲明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM