Какова цель JNDI


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

4 78

4 ответа:

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

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


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); все виды услуг могут быть заданы имена. Для более подробной информации, вы должны проверить Солнце учебник на эту тему.

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

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

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

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

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

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

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

Весна Пример:

Spring context file

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

<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 для удобства / безопасности / etc. (он же слой абстракции)

реализовать: настройка списка свойств, соответствующего предопределенным полям в контекстном интерфейсе 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