1. 程式人生 > >EJB和Web容器中的資源或元件是如何查詢的?

EJB和Web容器中的資源或元件是如何查詢的?

JavaEE中資源或元件是如何通過JNDI查詢的一直都沒完全弄清楚,這段時間花時間總算把它弄清楚了,總結如下:

(a).JavaEE1.5以前:

ServletA.java:

InitialContext ic=new InitialContext();
DataSource ds=(DataSource)ic.lookup("java:comp/env/jdbc/FooDS");
web.xml:
<resource-ref>
    <res-ref-name>jdbc/FooDS</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
</resource-ref>
sun-web.xml:
<resource-ref>
    <res-ref-name>jdbc/FooDS</res-ref-name>
    <jndi-name>jdbc/OracleDS</jndi-name>
</resource-ref>
其中sun-web.xml是廠商特定的配置檔案,不是JavaEE規範要求的,主要的作用是將容器中需要用到的資源或元件與應用伺服器定義的資源或元件關聯,這樣的配置檔案包括:
GlassFish&Sun AppServer: sun-web.xml  sun-ejb-jar.xml  sun-application-client.xml

<res-ref-name> is the name of a component dependency  and is relative to java:comp/env
<jndi-name>      is the name of a physical AppServer resource and is relative to the root of the AppServer's global namespace

(b).從JavaEE 5開始可以使用Annotations:
@Resource(name="jdbc/FooDS")
private DataSource ds;
等同於web.xml或ejb-jar.xml檔案中的如下定義
<resource-ref>
    <res-ref-name>jdbc/FooDS</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <injection-target>
        <injection-target-class>com.acme.ServletA</injection-target-class>
        <injection-target-name>ds</injection-target-name>
    </injection-target>
</resource-ref>

其中name屬性的預設值為:
FIELD: <class-name>/<field-name>
METHOD: <class-name>/<setter-property-name>
TYPE:  No defaulting. name() is required.
例如:
@Resource 
private DataSource ds;
等同於:
@Resource(name="com.acme.ServletA/ds")
private DataSource ds;

(c).可以使用mapped-name直接關聯到在應用伺服器上註冊的資源或元件的全域性名

// TYPE-level @Resource in Servlet
@Resource(name="jdbc/FooDS", type=javax.sql.DataSource.class, mappedName="jdbc/OracleDS")
public class ServletA{ ... }
等同於:
<resource-ref>
    <res-ref-name>jdbc/FooDS</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <mapped-name>jdbc/OracleDS</mapped-name>
</resource-ref>

使用這個功能的問題如下:
(1)不是JavaEE5規範要求必須實現的功能
(2)沒有統一的格式和語法,各廠商可以自己定義
(3)可以被優先順序更高的配置覆蓋,annotation < standard.xml < sun-*.xml

也可以使用mapped-name釋出資源或元件在應用伺服器上的全域性名
FooBean.java:
@Stateless(mappedName="ejb/MyFooBean")
public class FooBean implements Foo{
public String hello() { return "hello,world!/n"; }
}
MyAppClient.java:
@EJB(mappedName="ejb/MyFooBean")
private static Foo foo;

(d).對於沒有使用mapped-name,同時也沒有在廠商特定的配置檔案中設定關聯的資源或元件,應用伺服器採用如下規則:
(1).Session beans & ejb-refs
    jndi-name 自動設定成 Home/Business介面名
(2)[email protected], resource-ref, message-destination-ref, etc.
    jndi-name 自動設定成資源的 java:comp/env名

例如:
@Resource(name="jdbc/FooDS")
private DataSource ds;
等同於sun-web.xml:
<resource-ref>
    <res-ref-name>jdbc/FooDS</res-ref-name>
    <jndi-name>jdbc/FooDS</jndi-name>
</resource-ref>

@Stateless(name="FooBean")
public class FooBean implements Foo{ .. }
等同於sun-ejb-jar.xml:
<ejb>
    <ejb-name>FooBean</ejb-name>
    <jndi-name>com.acme.Foo</jndi-name>
</ejb>
@EJB(name="ejb/Foo")
private static Foo foo;
等同於sun-application-client.xml:
<ejb-ref>
    <ejb-ref-name>ejb/Foo</ejb-ref-name>
    <jndi-name>com.acme.Foo</jndi-name>
</ejb-ref>

(e).採用Global JNDI

 java:global[/<app-name>]/<module-name>/<bean-name>!<fully-qualified-interface-name>
<bean-name> corresponds to the session bean's EJB name.  It defaults to the unqualified name of the session bean class.  
It can be explicitly specified using the name attribute of the @Stateless/@Stateful/@Singleton annotation.  

Alternatively, if the ejb-jar.xml is being used to define the component, <bean-name> corresponds to the <ejb-name> element of ejb-jar.xml.

(f).如果同一個資源或元件用Annotation,javaEE規範定義的配置檔案,廠商特定的配置檔案中都定義了,那到底用哪個一般遵循如下優先順序:

Annotation < javaEE規範定義的配置檔案 < 廠商特定的配置檔案

例如glassfish中:

@Resouce <  <resource-ref> in web.xml<  <resource-ref> in sun-web.xml

glassfish, weblogic, websphere都遵循上面的順序,只不過廠商特定的配置檔案不同而已。


參考文件:
https://glassfish.java.net/javaee5/ejb/EJB_FAQ.html
https://glassfish.java.net/javaee5/ejb/compdependencies_xmlforum_nov15.pdf

相關推薦

EJBWeb容器資源元件是如何查詢的?

JavaEE中資源或元件是如何通過JNDI查詢的一直都沒完全弄清楚,這段時間花時間總算把它弄清楚了,總結如下: (a).JavaEE1.5以前: ServletA.java: InitialContext ic=new InitialContext(); DataSour

eclipse整合ejbweb工程

script rip 後綴 desc 工作區 clip jee enter ner 用 Eclipse JEE 版本的話,新建一個 Enterprise Application Project 工程(New --> Java EE --> Enterprise

web伺服器、Web中介軟體Web容器的區別

目錄 Web伺服器 中介軟體 容器 總結 Web開發的選擇 我們經常會被Web伺服器、Web容器和Web中介軟體這三個概念搞混。因為我們常見的很多網站要麼是由IIS搭建,要麼是由Apache、Tomcat、Ngnix搭建。所以,我們會把他們都叫成是Web伺服器,因為他們都

servlet、servlet容器web容器

Java Servlet(Java伺服器小程式)是一個基於Java技術的Web元件,執行在伺服器端,它由Servlet容器所管理,用於生成動態的內容。 Servlet是平臺獨立的Java類,編寫一個Servlet,實際上就是按照Servlet規範編寫一個Java類。Servlet被編譯為平臺

IoC容器Web容器的啟動

簡單的說,在web容器中,通過ServletContext為Spring的IOC容器提供宿主環境,對應的建立起一個IOC容器的體系。其中,首先需要建立的是根上下文,這個上下文持有的物件可以有業務物件,資料存取物件,資源,事物管理器等各種中間層物件。在這個上下文的基礎上,和w

Spring MVC原理之Spring應用上下文(IoC容器)在Web容器的啟動分析

Spring IoC是一個獨立的模組,它並不是直接在Web容器中發揮作用的。如果要在Web環境中使用IoC容器,需要Spring為IoC設計一個啟動過程,把IoC容器導人,並在Web容器中建立起來。具體說來,這個啟動過程是和Web容器的啟動過程整合在一起的

spring容器啟動之我見(四、獲取容器獲取容器的bean)

1.我們經常會發現在我們的service中有註解而在dao上沒有註解 看圖 因為我們在spring容器初始化bean的時候,是把service當做一個bean ,而dao並不是一個bean,這是個人理解,如果有錯誤,歡迎大家指出。 2. 那我們總結一下那些算是spri

初探spring applicationContext在web容器載入過程

首先從WEB.XML入手 ==>web.xml <context-param> <param-name>webAppRootKey</param-nam

Spring MVC 根應用上下文在Web容器的啟動及其銷燬

public WebApplicationContext initWebApplicationContext(ServletContext servletContext) { //判斷servletContext是否已有根上下文 if (servletContext.getAttribute(WebApp

web專案使用MarkDown元件

說明       在專案中,要錄入圖文資訊,需要將圖片存到伺服器。本篇博文將介紹在javaweb專案中,怎樣使用MarkDown元件。在專案中使用了servlet,smartupload進行檔案的上傳。原始碼放在了github中,原始碼地址:https://g

【C++】vector容器list容器使用單個迭代器的erase函式學習筆記

例題為:假設有如下ia的定義,ia複製到vector和list中,把list容器中奇數值元素刪除掉,把vector容器偶數值元素刪除掉。 陣列複製採用push_back操作。刪除操作採用了erase函式,由於該函式返回值為指向被刪除元素後面的元素,則使用了返回值賦值回給迭代

websphere的會話超時設定 web應用web.xmlsession-timeout關係

was幫助文件對會話超時的定義: 會話超時 指定在會話不再有效之前它有多長的時間可以保持不使用狀態。指定設定超時或無超時。以分鐘為單位指定大於或等於 2 的值。Web 模組部署描述符檔案中指定的值優先於管理控制檯設定。然而,如果未在 Web 模組部署描述符中指定會話超

ServletContextListener使用詳解以及web容器獲取spring容器

ServletContextListener 介面是servlet的一個介面,它能夠監聽 ServletContext 物件的生命週期,實際上就是監聽 Web 應用的生命週期(Tomcat的啟動與關閉)。 伺服器啟動時,ServletContextListener 的 co

web容器web.xmlServlet、Filter、context-param、listener的載入順序

  web容器在啟動web專案的時候,會根據專案中的web.xml配置檔案進行專案的初始化操作, 通過對web容器的原始碼分析和專案實踐,我們可以大致得出以下載入順序: 1)、載入<contex

java web 開發 eclipse myeclipse無法解析匯入 javax.servlet 的解決方法

  出現上述問題的原因是你的Eclipse專案沒有匯入JSP執行所需要的Tomcat類庫,主要是servlet-api.jar檔案(或者servlet.jar),tomcat容器裡面有這檔案,在以下位置:%Tomcat_Home%/common/lib/servlet-a

關於javaweb專案的相對路徑問題

http://blog.csdn.net/swlxm/archive/2007/04/27/1587185.aspxWeb專案中的相對路徑 在JSP的HTML部分中的相對路徑 在JSP的JAVA部分中的相對路徑  在FORM的ACTION屬性中的Servle

Spring框架介紹IoC容器Bean配置(Spring框架)

Spring框架整理第一發,Spring框架介紹,HelloWorld,IoC容器介紹,Bean配置 Spring概述      ①Spring為簡化企業級開發而生,使用Spring,JavaBean就可以實現很多以前要靠EJB才能實現的功能。同樣的功能,在EJB中要通過

使用jax-wsspring建立web容器共埠的webservice服務

本文介紹的webservice是建立在與spring整合的條件下【jdk自帶的webservices會佔用一個獨立的埠,通過這個方法配置不需要】 1、修改WEB.XML檔案,在spring的監聽器配置之後加上如下內容 <servlet> <servlet-name>JAXWS

Spring擴充套件:替換IOC容器的Bean元件 -- @Replace註解

## 1、背景:     工作中是否有這樣的場景?一個軟體系統會同時有多個不同版本部署,比如我現在做的IM系統,同時又作為公司的技術輸出給其他銀行,不同的銀行有自己的業務實現(比如登陸驗證、使用者資訊查詢等); 又或者你的工程裡依賴了公司的二方包A,A又依賴了B...這些jar包

React的展示元件容器元件

---恢復內容開始--- 展示元件(persentational components)     負責展示UI,也就是元件如何渲染,具有很強的內聚性。     只關心得到資料後如何渲染 容器元件(container components)