JavaEE中的依賴性——聲明依賴性,javaee依賴性聲明
已下小結描述了一些JavaEE和EJB規範定義的資源註解。每條註解有一個可選的name特性以指定依賴性的引用名稱。註解的其他特性特定於所需擷取的資源類型。
引用持久化上下文
前面的章節示範了如何通過從Persistence類返回一個EntityManagerFactory,為持久化上下文建立一個實體管理器。在JavaEE環境中,@PersistenceContext註解可以用來聲明一個持久化上下文上的依賴性,並且可以自動擷取那個持久化上下文所需的實體管理器。
下面代碼示範了如何使用@PersistenceContext註解,以通過依賴性注入獲得一個實體管理器。unitName元素指定了持久化上下文所基於的持久性單元的名稱。
提示:如果忽略unitName元素,那麼如何確定用於持久化內容相關的單元名稱是特定於供應商的。如果應用程式只有一個持久性單元,那麼有些供應商可以提供預設值,而其他供應商可能要求在一個特定於供應商的設定檔中指定單元名稱。
(代碼)
當接受了在一個無狀態會話bean中使用狀態欄位的警告之後,您可能想知道如何保證此代碼合法。畢竟,實體管理器必須維護自己的狀態,以便能夠管理特定的持久化上下文。好訊息是JPA規範旨在以JavaEE整合為目的,所以與前面的章節不同,代碼中世紀注入的不是一個實體管理器執行個體。注入bean的值是一個容器託管的代理,它將代表應用程式代碼來擷取和釋放持久化上下文。這是在JavaEE中Java持久化API的一個強大功能,將在後面對其進行深入學習。現在,假設注入值將“做正確的事情”是安全的,不必釋放它,並且它能夠自動的與應用伺服器的交易管理一起工作。
引入持久性單元
可以使用@PersistenceUnit註解引入持久性單元你的EntityManagerFactory。正如@persistenceContext註解一樣,unitName元素確定想要訪問的EntityManagerFactory執行個體的持久性單元。如果沒有在註解中指定持久性單元名稱,那麼如何確定該名稱將特定於供應商。
下面代碼中示範了如何把一個EntityManagerFactory執行個體注入有狀態會話bean中。然後,該bean將在PostConstruct生命週期回調期間從工廠建立一個EntityManager執行個體。注入的EntityManagerFactory執行個體可以安全的儲存在任何組件執行個體上。它是安全執行緒的,當刪除bean執行個體時無需對它進行釋放。
(代碼)
在JavaEE環境中,不是經常使用持久性單元的EntityManagerFactory,因為注入實體管理器很容易擷取和使用。您將在後面看到,從工廠返回的實體管理器和伺服器作為相應的@PersistenceContext註解而是提供的實體管理器之間有重要的區別。
引用企業JavaBean
當一個組件需要訪問EJB時,它利用@EJB註解聲明對該bean的引用。參考型別的目標通常是一個會話bean。訊息驅動bean沒有用戶端介面,因此它們不能直接存取,而且不能注入。我們已經示範了beanInterface元素,用於指定用戶端感興趣的會話bean的業務介面。伺服器將搜尋所有部署的會話bean以找到一個請求的業務介面的實現。
在罕見的情況下,兩個會話bean實現相同的業務介面,或者如果用戶端需要訪問位於不同EJB jar中的會話bean,那麼還可以指定beanName元素,用於通過其名稱來標識會話bean。一個會話bean的名稱預設為bean類的非限定類名,或者可以設定為顯示地使用@Stateless和Stateful註解的name元素。
下面代碼重新審視了在上面代碼中顯示的樣本,這次在注入的值上指定beanName元素。不推薦跨多個bean實現共用相同的業務介面。beanName元素應該幾乎從未被要求過。
(代碼)
引用伺服器資源
@Resource註解是指向所有I幀元類型的雜項(catchall)引用,它不對應起勁位置所描述的任何一種類型。它用來定義資源工廠、訊息目的地、資料來源和其他伺服器資源的引用。@Resource註解也是最容易定義的,因為唯一附加的元素是resourceType,如果伺服器不能自動指定的話,那麼它將允許您指定資源的類型。例如,如果您正在注入的欄位是Object(對象)類型,那麼伺服器沒有辦法知道您想要的是資料來源。resourceType元素可以設定為javax.sql.DataSource,以使得該需要顯示化。
@Resource註解的功能之一是可以用來擷取特定於組件類型的邏輯資源。這將包括EJBContext實現以及諸如EJB計時器服務之類的服務。如果沒有同樣地對它進行定義,那麼將使用setter注入來擷取在上面代碼中的EBContext執行個體。為了完成該樣本,將在setSessionContext方法上放置@Resource註解。下面代碼重新審視了上面代碼中的樣本,這次示範了使用欄位注入擷取一個SessionContext執行個體。
(代碼)