Jaki jest cel JNDI

Jak możesz sobie wyobrazić użycie JNDI, z przykładem, jeśli to możliwe?

 78
Author: Ajay, 2009-08-29

4 answers

JNDI jest interfejsem nazw i katalogów Java. Jest on używany do oddzielenia obaw aplikacji developer i aplikacji deployer . Pisząc aplikację, która opiera się na bazie danych, nie musisz martwić się o nazwę użytkownika lub hasło do łączenia się z tą bazą danych. JNDI pozwala programiście nadać nazwę bazie danych i polegać na wdrożeniu, aby zmapować tę nazwę do rzeczywistej instancji bazy danych.

Na przykład, jeśli jesteś pisząc kod, który działa w kontenerze Java EE, możesz napisać to, aby zdobyć źródło danych o nazwie 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
}

Uwaga nie ma tu nic o sterowniku bazy danych, nazwie użytkownika ani haśle. Który jest skonfigurowany wewnątrz kontenera.

JNDI nie jest ograniczone do baz danych (JDBC); wszelkiego rodzaju usługi mogą mieć nazwy. Aby uzyskać więcej informacji, zapoznaj się z Sun tutorial na ten temat.

 97
Author: Simon Nickerson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-21 21:48:46

JNDI jest bardzo potężnym mechanizmem zarówno organizowania informacji konfiguracyjnych, jak i odkrywania i słuchania usług za pomocą EventContext. W JNDI możesz wyszukać i odsłuchać dowolny obiekt (nie tylko DataSources), zakładając, że twój dostawca usług JNDI go obsługuje.

Oczywiście jedynym problemem jest posiadanie dostawcy usług JNDI; wspaniałą rzeczą jest to, że zaskakująco łatwo jest toczyć własne. W końcu możesz zakodować dowolną instancję Javy do XML używając JavaBeans XMLEncoder i XMLDecoder: nie musisz polegać na działaniu na serwerze aplikacji!

Więc jaka jest różnica między tymi plikami konfiguracyjnymi? Cóż, może to być dużo czystsze, ponieważ wszystkie Twoje aplikacje mogą uzyskać swoją konfigurację z tego samego miejsca . Jeśli muszą udostępnić informacje konfiguracyjne (np. lokalizacje bazy danych), to można to zdefiniować raz w JNDI. Załóżmy, że przeniosłeś serwery baz danych: nie musisz zapamiętaj pliki konfiguracyjne gazillion z lokalizacją w nim. Po prostu idź do jednego miejsca: JNDI.

 28
Author: oxbow_lakes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-29 17:23:47

JNDI jest API używanym do uzyskiwania dostępu do katalogów i usług nazewnictwa (tj. środków, za pomocą których nazwy są powiązane z obiektami). Skojarzenie nazwy z obiektem nazywa się wiązaniem.

Podstawowym przykładem usługi nazewnictwa jest DNS, który mapuje nazwy maszyn na adresy IP.

Używając JNDI, aplikacje mogą przechowywać i pobierać nazwane Obiekty Java dowolnego typu.

W kontekście Javy może to być używane w plikach konfiguracyjnych, w których nie chcesz kodować na twardo zmienne specyficzne dla środowiska.

Przykład Wiosny:

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>

plik kontekstowy 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"/>
 11
Author: Ithar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-28 13:02:38

JNDI pozwala na uproszczenie konstrukcji zasobu do tylko Nazwa . Tak więc, to wiele szczegółów Grupa w 1 dla wygody/bezpieczeństwa / itp. (aka abstraction layer)

do realizacji: skonfiguruj listę właściwości odpowiadającą wstępnie zdefiniowanym polom w interfejsie kontekstowym Jndi. (te właściwości określają ustawienia dla wykonania jndi; ale * nie nazwę wyszukiwania)

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

Najlepiej byłoby, gdyby istniała wyspecjalizowana funkcja utrzymująca LDAP katalog, DNS, itp. w Twojej organizacji (więc zunifikowany zestaw pojedynczych usług mapowania, zmniejszający rozbieżności)

Lista dostawców usług 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

 3
Author: ilupper,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-25 12:49:18