Какова цель JNDI - PullRequest
       20

Какова цель JNDI

86 голосов
/ 29 августа 2009

Как вы можете реализовать использование JNDI, с примером, если это возможно?

Ответы [ 4 ]

103 голосов
/ 29 августа 2009

JNDI - это интерфейс именования и каталогов Java. Он используется для разделения проблем приложения developer и приложения deployer . Когда вы пишете приложение, основанное на базе данных, вам не нужно беспокоиться об имени пользователя или пароле для подключения к этой базе данных. JNDI позволяет разработчику давать имя базе данных и полагаться на развертывателя, чтобы сопоставить это имя с реальным экземпляром базы данных.

Например, если вы пишете код, который выполняется в контейнере Java EE, вы можете написать это, чтобы получить источник данных с именем JNDI «База данных»:


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

Обратите внимание, что здесь нет ничего о драйвере базы данных, ни имени пользователя, ни пароле. Это настроено внутри контейнера.

JNDI не ограничивается базами данных (JDBC); всевозможные услуги могут быть названы. Для получения более подробной информации вы можете обратиться к Sun учебник по теме.

29 голосов
/ 29 августа 2009

JNDI - очень мощный механизм как для организации информации о конфигурации, так и для обнаружения и прослушивания служб с помощью EventContext. В JNDI вы можете искать и прослушивать любой объект (не только DataSource s), при условии, что ваш поставщик услуг JNDI поддерживает его.

Конечно, единственная проблема - это наличие поставщика услуг JNDI; Самое замечательное в этом то, что на удивление легко накатить свой собственный. В конце концов, вы можете закодировать любой экземпляр Java в XML, используя JavaBeans XMLEncoder и XMLDecoder: вам не нужно полагаться на работу на сервере приложений!

Так в чем же разница между наличием файлов конфигурации? Ну, это может быть намного чище, потому что все ваши приложения могут получить свою конфигурацию из в одном месте . Если им необходимо предоставить информацию о конфигурации (например, местоположения базы данных), тогда это можно определить один раз в JNDI . Предположим, вы переместили серверы баз данных: вам не нужно запоминать файлы конфигурации gazillion с указанием их местоположения. Вы просто идете в одно место: JNDI.

11 голосов
/ 28 марта 2014

JNDI - это API, используемый для доступа к каталогу и службам имен (т. Е. Средства, с помощью которого имена связаны с объектами). Ассоциация имени с объектом называется привязкой.

Базовым примером службы именования является DNS, который сопоставляет имена компьютеров с IP-адресами.

Используя JNDI, приложения могут хранить и извлекать именованные объекты Java любого типа.

В контексте java это может использоваться в файлах конфигурации, где вы не хотите жестко программировать переменные, специфичные для окружения.

Spring Пример:

Файл контекста Spring

<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>

Файл контекста 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 голосов
/ 13 июня 2012

JNDI позволяет упростить конструкцию ресурса до имени . Итак, это много деталей группа в 1 для удобства / безопасности / и т.д. (он же слой абстракции)

для реализации: настроить список свойств, который соответствует предопределенным полям в интерфейсе Jndi Context. (эти свойства определяют настройки для выполнения jndi; но * не имя для поиска)

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*");

в идеале в вашей организации должна существовать специализированная функция для поддержки каталога LDAP, DNS и т. Д. (Так что единый набор единого сопоставления обслуживает все, уменьшая расхождения)

Список поставщиков услуг JNDI: https://www.ibm.com/support/knowledgecenter/en/SSVSD8_8.4.1/com.ibm.websphere.dtx.adapjndi.doc/concepts/c_jndi_JNDI_Service_Providers_.htm

...