Mục lục
JNDI là một API được chỉ định trong công nghệ Java, cung cấp chức năng đặt tên và thư mục cho các ứng dụng được viết bằng ngôn ngữ lập trình Java. Nó được thiết kế đặc biệt cho nền tảng Java bằng mô hình đối tượng của Java. Sử dụng JNDI, các ứng dụng dựa trên công nghệ Java có thể lưu trữ và truy xuất các đối tượng Java có tên thuộc bất kỳ loại nào. Ngoài ra, JNDI cung cấp các phương thức để thực hiện các hoạt động thư mục tiêu chuẩn, chẳng hạn như liên kết các thuộc tính với các đối tượng và tìm kiếm các đối tượng bằng các thuộc tính của chúng.
JNDI cũng được định nghĩa độc lập với bất kỳ việc thực hiện dịch vụ đặt tên hoặc thư mục cụ thể nào. Nó cho phép các ứng dụng truy cập các dịch vụ thư mục, đặt tên và thư mục khác nhau, có thể sử dụng API chung. Các nhà cung cấp dịch vụ đặt tên và thư mục khác nhau có thể được cắm liền mạch đằng sau API chung này. Điều này cho phép các ứng dụng dựa trên công nghệ Java tận dụng thông tin trong nhiều dịch vụ đặt tên và thư mục hiện có, chẳng hạn như LDAP, NDS, DNS và NIS (YP), cũng như cho phép các ứng dụng cùng tồn tại với các hệ thống và phần mềm cũ.
Sử dụng JNDI làm công cụ, bạn có thể xây dựng các ứng dụng di động và mạnh mẽ mới, không chỉ tận dụng mô hình đối tượng của Java mà còn được tích hợp tốt với môi trường mà chúng được triển khai.
Kiến trúc JNDI
Kiến trúc JNDI bao gồm 1 API và một SPI (Serivce provider interface). Các ứng dụng Java sử dụng JNDI API để sử dụng chức năng naming và directory. Lưu ý JNDI chỉ là một interface quy định các hàm được sử dụng chúng ta cần một JDNI provider triển khai các method được nó định nghĩa. SPI cho phép chúng ta linh hoạt sử dụng các JNDI prodiver như LDAP, DNS, NIS etc.
Chúng ta cố một số JNDI provider phổ biến:
- Lightweight Directory Access Protocol (LDAP)
- Common Object Request Broker Architecture (CORBA) Common Object Services (COS) name service
- Java Remote Method Invocation (RMI) Registry
- Domain Name Service (DNS)
Trường hợp sử dụng JNDI phổ biến
Trường hợp sử dụng phổ biến nhất là thiết lập nhóm kết nối cơ sở dữ liệu trên máy chủ ứng dụng Java EE. Bất kỳ ứng dụng nào được triển khai trên máy chủ đó đều có thể có quyền truy cập vào các kết nối họ cần bằng cách sử dụng tên JNDI Java:comp/env/FooBarPool
mà không cần phải biết chi tiết về kết nối.
Điều này có một số lợi thế:
- Nếu bạn có trình tự triển khai trong đó các ứng dụng di chuyển từ môi trường
devl->int->test->prod
, bạn có thể sử dụng cùng tên JNDI trong mỗi môi trường và ẩn cơ sở dữ liệu thực tế đang được sử dụng. Các ứng dụng không phải thay đổi khi chúng di chuyển giữa các môi trường. - Bạn có thể giảm thiểu số lượng người cần biết thông tin đăng nhập để truy cập cơ sở dữ liệu sản xuất. Chỉ máy chủ ứng dụng Java EE cần biết nếu bạn sử dụng JNDI.
Name Interface
Name objectName = new CompositeName("java:comp/env/jdbc");
Name Interface cung cấp cơ chế quản lý tên và cú pháp cho JNDI. Thành phần đầu tiên trong chuỗi đứng trước dấu / đại diện cho global context, theo phía sau đại diện cho các sub-content.
import javax.naming.CompositeName; import javax.naming.InvalidNameException; import javax.naming.Name; import java.util.Enumeration; class Main { public static void main(String[] args) throws InvalidNameException { Name objectName = new CompositeName("java:comp/env/jdbc"); Enumeration<String> elements = objectName.getAll(); while(elements.hasMoreElements()) { System.out.println(elements.nextElement()); } } }
Output:
java:comp
env
jdbc
Context Interface
Context interface chưa các thuộc tính của naming và directory service. Dưới đây là ví dụ context trong Spring.
SimpleNamingContextBuilder builder = new SimpleNamingContextBuilder(); builder.activate();
SimpleNamingContextBuilder trong Spring giúp chúng ta tạo một JNDI provider và sau đó khởi chạy với NamingManager.
JndiTemplate jndiTemplate = new JndiTemplate(); ctx = (InitialContext) jndiTemplate.getContext();
Binding và Lookup
Sau khi khởi tạo thành công SimpleNamingContextBuilder, chúng ta có thể sử dụng nó để lưu trữ JDBC Datasource thông qua bind() method.
ds = new DriverManagerDataSource("jdbc:h2:mem:mydb"); ctx.bind("java:comp/env/jdbc/datasource", ds);
Sau khi đã binding Datasource thành công, chúng ta có thể truy xuất lại với lookup
DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/datasource");
Nguồn tham khảo
https://stackoverflow.com/questions/1350816/what-is-the-purpose-of-jndi
https://docs.oracle.com/javase/jndi/tutorial/getStarted/overview/index.html