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ể?
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ể?
Câu trả lời:
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 .
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ỉ DataSource
cá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 XML
JavaBeans XMLEncoder
và XMLDecoder
: 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.
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"/>
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