Яка мета JNDI


90

Як ви можете реалізувати використання JNDI, на прикладі, якщо це можливо?


3
Ви можете перевірити особисту публікацію в блозі щодо випадків використання: tshikatshikaaa.blogspot.com/2013/01/…
Jérôme Verstrynge

@JVerstry +1 за вказівку на статтю, яка розповідає про пов'язані LDAP, JCA та CCI.
Аджай

Перегляньте цю тему SO
Aniket Thakur

Відповіді:


109

JNDI - це інтерфейс іменування та каталогу Java. Він використовується для розділення проблем розробника програми та програми розгортання додатків . Коли ви пишете програму, яка спирається на базу даних, вам не потрібно турбуватися про ім'я користувача або пароль для підключення до цієї бази даних. 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); всілякі послуги можуть отримувати імена. Щоб отримати докладнішу інформацію, вам слід ознайомитися з підручником Oracle .


10
Отже, у цьому прикладі на малюнку, чим JNDI відрізняється від розміщення імен баз даних у файлі конфігурації xml або файлі властивостей, а потім зчитуванні звідти?
Аджай

11
По-перше, вам потрібно буде зберегти пароль у вигляді простого тексту у вашому конфігураційному файлі. По-друге, якщо у вас є кілька програм, що вказують на одну і ту ж базу даних, і щось про зміну конфігурації бази даних, вам доведеться оновлювати конфігурацію в кількох місцях.
Саймон Нікерсон

1
ну як тут допомагає JNDI?
Аджай

1
він повинен містити все, що вам потрібно знати про JNDI, будь то в контексті J2EE або в контексті JavaSE. javaworld.com/javaworld/jw-04-2002/jw-0419-jndi.html
Ніко

5
@SimonNickerson Привіт !. Я дізнаюся про JNDI. Це хороша відповідь, але якщо ви помітите запитання "Як ви можете усвідомити використання JNDI?" тоді це виглядає незавершеним. Ви описали реалізацію з точки зору розробника. Як щодо перспективи диспетчера?
lxknvlk

30

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

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

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


Це, безумовно, найбільш округлене роз’яснення - Дякую oxbow_lakes! До речі, чи могли б ви мати покажчики коду, де будь-який екземпляр Java був закодований, як ви пропонуєте?
Рохан Кумар,

13

JNDI - це API, що використовується для доступу до каталогів та служб іменування (тобто засобів, за допомогою яких імена асоціюються з об’єктами). Пов’язання імені з об’єктом називається прив’язкою.

Основним прикладом служби іменування є DNS, який відображає імена машин на IP-адреси.

За допомогою JNDI програми можуть зберігати та отримувати іменовані об'єкти Java будь-якого типу.

У контексті Java це може бути використано у файлах конфігурації, де ви не хочете жорстко кодувати специфічні змінні середовища.

Приклад весни:

Весняний контекстний файл

<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

JNDI дозволяє спростити конструкцію ресурсу лише на ім'я . Отже, багато деталей об’єднуються в 1 для зручності / безпеки / тощо. (він же абстракційний шар)

для реалізації: встановіть список властивостей, який відповідає заздалегідь визначеним полям у контекстному інтерфейсі Jndi. (ці властивості визначають налаштування для виконання 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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.