Mục đích của JNDI là gì


90

Làm thế nào bạn có thể nhận ra việc sử dụng JNDI, với một ví dụ nếu có thể?


3
Bạn có thể kiểm tra một bài viết trên blog cá nhân đối với trường hợp sử dụng: tshikatshikaaa.blogspot.com/2013/01/...
Jérôme Verstrynge

@JVerstry +1 vì đã trỏ đến một bài báo nói về LDAP, JCA và CCI có liên quan.
Ajay

Câu trả lời:


109

JNDI là Giao diện Thư mục và Đặt tên Java. Nó được sử dụng để phân tách mối quan tâm của nhà phát triển ứng dụng và người triển khai ứng dụng . Khi bạn đang viết một ứng dụng dựa trên cơ sở dữ liệu, bạn không cần phải lo lắng về tên người dùng hoặc mật khẩu để kết nối với cơ sở dữ liệu đó. JNDI cho phép nhà phát triển đặt tên cho cơ sở dữ liệu và dựa vào trình triển khai để ánh xạ tên đó với một phiên bản thực của cơ sở dữ liệu.

Ví dụ: nếu bạn đang viết mã chạy trong vùng chứa Java EE, bạn có thể viết mã này để nắm giữ nguồn dữ liệu có tên JNDI "Cơ sở dữ liệu":


DataSource dataSource = null;
try
{
    Context context = new InitialContext();
    dataSource = (DataSource) context.lookup("Database");
}
catch (NamingException e)
{
    // Couldn't find the data source: give up
}

Lưu ý rằng không có gì ở đây về trình điều khiển cơ sở dữ liệu, tên người dùng hoặc mật khẩu. Điều đó được cấu hình bên trong vùng chứa.

JNDI không bị giới hạn đối với cơ sở dữ liệu (JDBC); tất cả các loại dịch vụ có thể được đặt tên. Để biết thêm chi tiết, bạn nên xem hướng dẫn của Oracle .


10
Vậy với ví dụ trong hình này, JNDI khác với việc đặt tên Cơ sở dữ liệu trong tệp config xml hoặc tệp thuộc tính và sau đó đọc nó từ đó như thế nào?
Ajay

11
Đầu tiên, bạn phải lưu trữ mật khẩu dưới dạng văn bản thuần túy trong tệp cấu hình của mình. Thứ hai, nếu bạn có một số ứng dụng trỏ đến cùng một cơ sở dữ liệu và điều gì đó về cấu hình cơ sở dữ liệu thay đổi, bạn phải cập nhật cấu hình ở nhiều nơi.
Simon Nickerson

1
tốt, JNDI giúp gì ở đây?
Ajay

1
điều này sẽ chứa tất cả những gì bạn cần biết về JNDI, dù trong ngữ cảnh J2EE hay ngữ cảnh JavaSE. javaworld.com/javaworld/jw-04-2002/jw-0419-jndi.html
Nico

5
@SimonNickerson Xin chào !. Tôi đang tìm hiểu về JNDI. Đây là một câu trả lời hay, nhưng nếu bạn nhận thấy câu hỏi "Làm thế nào bạn có thể nhận ra cách sử dụng JNDI?" thì nó có vẻ chưa hoàn thành. Bạn đã mô tả hiện thực từ quan điểm của nhà phát triển. Làm thế nào về quan điểm của người triển khai?
lxknvlk

30

JNDI là một cơ chế rất mạnh để vừa tổ chức thông tin cấu hình, vừa khám phá và lắng nghe các dịch vụ thông qua việc sử dụng EventContext. Trong JNDI, bạn có thể tra cứu và lắng nghe bất kỳ đối tượng nào (không chỉ DataSourcecác đối tượng ), giả sử nhà cung cấp dịch vụ JNDI của bạn hỗ trợ nó.

Tất nhiên, vấn đề duy nhất thực sự là có một nhà cung cấp dịch vụ JNDI; điều tuyệt vời về điều này là bạn có thể tự cuộn dễ dàng một cách đáng ngạc nhiên. Sau cùng, bạn có thể mã hóa bất kỳ phiên bản Java nào thành XMLJavaBeans XMLEncoderXMLDecoder: bạn không cần phải chạy trong một máy chủ ứng dụng!

Vì vậy, sự khác biệt giữa điều này có các tệp cấu hình là gì? Chà, nó có thể gọn gàng hơn nhiều vì tất cả các ứng dụng của bạn có thể lấy cấu hình của chúng từ cùng một nơi . Nếu họ cần chia sẻ thông tin cấu hình (ví dụ: vị trí cơ sở dữ liệu) thì điều này có thể được xác định một lần trong JNDI . Giả sử bạn đã di chuyển các máy chủ cơ sở dữ liệu: bạn không cần nhớ các tệp cấu hình gazillion với vị trí trong đó. Bạn chỉ cần đến một nơi duy nhất: JNDI.


Đây là cách làm rõ ràng nhất cho đến nay - Cảm ơn bạn oxbow_lakes! Btw, bạn có con trỏ mã nơi bất kỳ phiên bản Java nào đã được mã hóa như bạn đề xuất không?
Rohan Kumar

13

JNDI là một API được sử dụng để truy cập vào thư mục và các dịch vụ đặt tên (nghĩa là các phương tiện mà tên được liên kết với các đối tượng). Sự liên kết của một tên với một đối tượng được gọi là một ràng buộc.

Một ví dụ cơ bản về dịch vụ đặt tên là DNS ánh xạ tên máy với địa chỉ IP.

Sử dụng JNDI, các ứng dụng có thể lưu trữ và truy xuất các đối tượng Java được đặt tên thuộc bất kỳ loại nào.

Trong ngữ cảnh của java, điều này có thể được sử dụng trong các tệp cấu hình mà bạn không muốn mã hóa các biến cụ thể của môi trường.

Ví dụ mùa xuân:

Tệp ngữ cảnh mùa xuân

<bean id="WSClientConfig" class="com.example.BaseClientConfigImpl">
<property name="protocol">
    <jee:jndi-lookup jndi-name="java:comp/env/protocol" />
</property>
<property name="endpoint">
    <jee:jndi-lookup jndi-name="java:comp/env/endpoint" />
</property>
<property name="requestPath">
<jee:jndi-lookup jndi-name="java:comp/env/requestPath" />    
</property>

Tệp ngữ cảnh Tomcat

<Environment name="protocol" type="java.lang.String" value="https://"/>
<Environment name="endpoint" type="java.lang.String" value="172.0.0.1"/>
<Environment name="requestPath" type="java.lang.String" value="/path/to/service"/>

3

JNDI cho phép đơn giản hóa cấu trúc tài nguyên chỉ thành một cái tên . Vì vậy, nhiều chi tiết được nhóm thành 1 để thuận tiện / bảo mật / vv. (hay còn gọi là lớp trừu tượng)

để nhận ra: thiết lập danh sách thuộc tính tương ứng với các trường được xác định trước trong Giao diện ngữ cảnh Jndi. (các thuộc tính này chỉ định cài đặt cho việc thực thi jndi; nhưng * không phải tên tìm kiếm)

Properties props = new Properties();
//field Context.INITIAL_CONTEXT_FACTORY => property name java.naming.factory.initial
    //field Context.PROVIDER_URL => property name java.naming.provider.url
props.load(new FileInputStream("*properties file*")); //prop file in this case

Context ctx = new InitialContext(props);
    Object o = ctx.lookup("*name of resource*");

lý tưởng, một chức năng chuyên biệt sẽ tồn tại để duy trì thư mục LDAP, DNS, v.v., tại tổ chức của bạn (vì vậy, một bộ ánh xạ duy nhất thống nhất tất cả các dịch vụ, giảm sự khác biệt)

Danh sách các nhà cung cấp dịch vụ JNDI: https://www.ibm.com/support/knowledgecenter/en/SSVSD8_8.4.1/com.ibm.websphere.dtx.adapjndi.doc/concept/c_jndi_JNDI_Service_Providers_.htm

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.