JNDI là gì? Cách sử dụng JNDI trong Java
JNDI, viết tắt của Java Naming and Directory Interface, là một API được sử dụng 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 Java. Được thiết kế dành riêng cho nền tảng Java, JNDI cho phép các ứng dụng Java lưu trữ và truy xuất các đối tượng Java theo tên. Ngoài ra, JNDI cung cấp các phương thức cho việc liên kết thuộc tính với đối tượng và tìm kiếm đối tượng theo các thuộc tính của chúng.
JNDI độc lập với các dịch vụ đặt tên và thư mục cụ thể, cho phép các ứng dụng truy cập vào các dịch vụ thư mục, đặt tên và thư mục khác nhau qua một API chung. Các nhà cung cấp dịch vụ đặt tên và thư mục khác nhau có thể được tích hợp với API chung này. Điều này cho phép các ứng dụng Java tận dụng thông tin từ nhiều dịch vụ đặt tên và thư mục hiện có như LDAP, NDS, DNS và NIS (YP), và tồn tại song song với các hệ thống và phần mềm cũ.
Bằng cách sử dụng JNDI, bạn có thể xây dựng các ứng dụng Java mạnh mẽ và linh hoạt, không chỉ tận dụng mô hình đối tượng của Java mà còn tích hợp tốt với môi trường triển khai.
Kiến trúc JNDI
Kiến trúc JNDI bao gồm một API và một SPI (Service Provider Interface). Các ứng dụng Java sử dụng JNDI API để sử dụng chức năng đặt tên và thư mục. Lưu ý rằng JNDI chỉ là một giao diện quy định các phương thức, vì vậy chúng ta cần một nhà cung cấp JNDI triển khai các phương thức này. SPI cho phép chúng ta linh hoạt sử dụng các nhà cung cấp JNDI như LDAP, DNS, NIS, v.v.
Dưới đây là một số nhà cung cấp JNDI 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
Một trường hợp sử dụng phổ biến của JNDI 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 triển khai trên máy chủ đó có thể truy cập vào kết nối mà họ cần thông qua tên JNDI “java:comp/env/FooBarPool” mà không cần biết chi tiết về kết nối.
Việc sử dụng JNDI trong trường hợp này có một số lợi ích:
- Nếu bạn có một quy trình 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 thông tin về cơ sở dữ liệu thực tế đang được sử dụng. Các ứng dụng không cần thay đổi khi di chuyển giữa các môi trường.
- Bạn có thể giảm 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 phẩm. Chỉ máy chủ ứng dụng Java EE cần biết rằng bạn đang sử dụng JNDI.
Giao diện Name
Giao diện Name cung cấp cơ chế quản lý tên và cú pháp cho JNDI. Phần đầu tiên trong chuỗi trước dấu / đại diện cho context toàn cục, trong khi các phần sau đại diện cho các sub-context.
Ví dụ:
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"); Enumerationelements = objectName.getAll(); while (elements.hasMoreElements()) { System.out.println(elements.nextElement()); } } }
Kết quả:
java:compenvjdbc
Giao diện Context
Giao diện Context chứa các thuộc tính của dịch vụ đặt tên và thư mục. Dưới đây là ví dụ về việc sử dụng Context trong Spring.
SimpleNamingContextBuilder builder = new SimpleNamingContextBuilder(); builder.activate(); JndiTemplate jndiTemplate = new JndiTemplate(); Context ctx = (Context) jndiTemplate.getContext();
Binding và Lookup
Sau khi tạo thành công SimpleNamingContextBuilder, chúng ta có thể lưu trữ JDBC Datasource thông qua phương thức bind().
ds = new DriverManagerDataSource("jdbc:h2:mem:mydb"); ctx.bind("java:comp/env/jdbc/datasource", ds);
Sau khi đưa ra liên kết thành công, chúng ta có thể truy xuất lại thông qua phương thức lookup.
DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/datasource");
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
https://www.baeldung.com/jndi