Як ви можете реалізувати використання JNDI, на прикладі, якщо це можливо?
Як ви можете реалізувати використання JNDI, на прикладі, якщо це можливо?
Відповіді:
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 .
JNDI - це дуже потужний механізм як для організації інформації про конфігурацію, так і для пошуку та прослуховування послуг за допомогою EventContext
. У JNDI ви можете шукати та слухати будь-який об'єкт (а не тільки DataSource
), припускаючи, що ваш постачальник послуг JNDI це підтримує.
Звичайно, єдиною проблемою є насправді наявність постачальника послуг JNDI; Найцікавіше в цьому полягає в тому, що напрочуд легко прокрутити власні. Врешті-решт, ви можете кодувати будь-який екземпляр Java для XML
використання JavaBeans XMLEncoder
і XMLDecoder
: вам не потрібно покладатися на роботу на сервері додатків!
То яка різниця між цим наявними файлами конфігурації? Ну, це може бути набагато чистіше, тому що всі ваші програми можуть отримати свою конфігурацію з одного місця . Якщо їм потрібно надати інформацію про конфігурацію (наприклад, розташування бази даних), це можна визначити один раз у JNDI . Припустимо, ви перемістили сервери баз даних: вам не потрібно запам'ятовувати конфігураційні файли gazillion з місцем розташування в них. Ви просто їдете в одне місце: JNDI.
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"/>
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