Как вы можете реализовать использование JNDI с примером, если это возможно?
В чем цель JNDI
Ответ 1
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.
Ответ 2
JNDI - очень мощный механизм как для организации информации о конфигурации, так и для обнаружения и прослушивания сервисов с помощью EventContext
. В JNDI вы можете искать и прослушивать любой объект (а не только DataSource
s), если ваш поставщик услуг JNDI поддерживает его.
Конечно, единственная проблема заключается в наличии поставщика услуг JNDI; великая вещь в этом заключается в том, что это удивительно легко сворачивать ваши собственные. В конце концов, вы можете закодировать любой экземпляр Java в XML
с помощью JavaBeans XMLEncoder
и XMLDecoder
: вам не нужно полагаться на запуск на сервере приложений!
Так в чем же разница между тем, что у вас есть файлы конфигурации? Ну, это может быть намного чище, потому что все ваши приложения могут получить конфигурацию из одного места. Если им необходимо предоставить информацию о конфигурации (например, расположение базы данных), тогда это можно определить один раз в JNDI. Предположим, вы переместили серверы баз данных: вам не нужно запоминать файлы конфигурации gazillion с указанием места в нем. Вы просто заходите в одно место: JNDI.
Ответ 3
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"/>
Ответ 4
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
Ответ 5
Да, но как насчет случая, когда вы хотите, чтобы JNDI соединялся с базой данных с принудительным соединением SSL? Все это относится только к соединениям без SSL.