Интерфейс именования и каталогов Java (JNDI ) - это Java API для службы каталогов, который позволяет клиентам программного обеспечения Java обнаруживать и искать данные и ресурсы (в виде объектов Java ) по имени. Как и все API Java, взаимодействующие с хост-системами, JNDI не зависит от базовой реализации. Кроме того, он определяет интерфейс поставщика услуг (SPI), который позволяет подключать реализации службы каталогов к платформе. Информация, просматриваемая через JNDI, может быть предоставлена сервером, плоским файлом или базой данных; выбор зависит от используемой реализации.
Типичное использование JNDI включает:
API-интерфейсы Java RMI и Java EE используют JNDI API для поиска объектов в сети.
API предоставляет:
Часть SPI обеспечивает поддержку практически любого типа именования или службы каталогов, включая:
Sun Microsystems впервые выпустила спецификацию JNDI 10 марта 1997 года. По состоянию на 2006 год текущая версия - JNDI 1.2.
JNDI (интерфейс именования и каталогов Java) организует свои имена в иерархию. Имя может быть любой строкой, например com.example.ejb.MyBean. Имя также может быть объектом, реализующим интерфейс Name
; однако строка - это наиболее распространенный способ назвать объект. Имя привязывается к объекту в каталоге, сохраняя либо объект, либо объект в службе каталогов, идентифицированный по имени.
JNDI API определяет контекст, который указывает, где искать объект. Начальный контекст обычно используется в качестве отправной точки.
В простейшем случае начальный контекст должен быть создан с использованием конкретной реализации и дополнительных параметров, необходимых для реализации. Первоначальный контекст будет использоваться для поиска имени. Начальный контекст аналогичен корню или вершине дерева каталогов файловой системы. Ниже приведен пример создания начального контекста:
Hashtable contextArgs = new Hashtable(); // Сначала вы должны указать фабрику контекста. // Вот как вы выбираете между реализацией jboss // и реализацией Sun или других поставщиков. contextArgs.put (Context.INITIAL_CONTEXT_FACTORY, "com.jndiprovider.TheirContextFactory"); // Следующий аргумент - это URL-адрес, указывающий, где находится хранилище данных: contextArgs.put (Context.PROVIDER_URL, "jndiprovider-database"); // (Вам также может потребоваться предоставить учетные данные безопасности) // Затем вы создаете начальный контекст Context myCurrentContext = new InitialContext (contextArgs);
Затем контекст используется для поиска ранее связанных имен в этом контексте. Например:
MyBean myBean = (MyBean) myCurrentContext.lookup ("com.mydomain.MyBean");
Альтернатива приведенному выше коду выглядит следующим образом:
Объект контекста также можно настроить, добавив файл jndi.properties в путь к классам, содержащий имя исходного класса фабрики контекста и URL-адрес поставщика. Приведенный выше код будет уменьшен, как показано ниже:
// просто нужно создать начальный объект контекста, он попытается прочитать файл jndi.properties из пути к классам. Контекст myCurrentContext = new InitialContext ();
Затем контекст используется для поиска ранее связанных имен в этом контексте. Например:
MyBean myBean = (MyBean) myCurrentContext.lookup ("com.mydomain.MyBean");
Атрибуты могут быть прикреплены к специальным записям, называемым каталогами. Каталоги позволяют искать объекты по связанным с ними атрибутам. Каталоги - это разновидность контекста; они ограничивают пространство имен так же, как это делает структура каталогов в файловой системе.