2009-08-29 35 views
70

Jak można wykorzystać wykorzystanie JNDI, jeśli to możliwe, na przykład?Jaki jest cel JNDI

+3

Można sprawdzić prywatnego blogu dla przypadków użycia: http : // tshikatshikaaa.blogspot.com/2013/01/what-is-jndi-spi-cci-ldap-and-jca.html – JVerstry

+0

@JVerstry +1 za wskazanie artykułu, który mówi o powiązanych LDAP, JCA i CCI. – Ajay

+0

Sprawdź [ten wątek] (http://stackoverflow.com/a/21227726/2396539) –

Odpowiedz

90

JNDI to interfejs nazw i katalogów Java. Służy do rozdzielania problemów aplikacji i aplikacji. Podczas pisania aplikacji, która bazuje na bazie danych, nie musisz martwić się o nazwę użytkownika ani hasło do łączenia się z tą bazą danych. JNDI umożliwia programistom nadanie nazwy bazie danych i polega na tym, że wdrażający zmapuje tę nazwę do rzeczywistego wystąpienia bazy danych.

Na przykład, jeśli masz kod, który działa w kontenerze Java EE pisanie, można napisać to zdobyć źródło danych z nazwą JNDI „Baza danych”:


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 nic tutaj o sterowniku bazy danych, nazwie użytkownika lub haśle. To jest skonfigurowane wewnątrz kontenera.

JNDI nie ogranicza się do baz danych (JDBC); wszystkie rodzaje usług mogą mieć nadane imiona. Aby uzyskać więcej informacji, należy zapoznać się z tematem Sun tutorial.

+9

Więc z tym przykładem na obrazku, jak JNDI różni się od umieszczania nazw bazy danych w pliku config xml lub pliku właściwości, a następnie czytając to stamtąd? – Ajay

+9

Po pierwsze, musisz przechowywać hasło w postaci zwykłego tekstu w pliku konfiguracyjnym. Po drugie, jeśli masz kilka aplikacji wskazujących na tę samą bazę danych i coś ze zmian w konfiguracji bazy danych, musisz zaktualizować konfigurację w wielu miejscach. –

+0

cóż, w jaki sposób JNDI pomaga tutaj? – Ajay

26

JNDI to bardzo potężny mechanizm do organizowania informacji o konfiguracji i odkrywania i słuchania usług przy użyciu EventContext. W JNDI można wyszukiwać i słuchać obiektu dowolnego obiektu (nie tylko s), zakładając, że obsługuje go dostawca usług JNDI.

Oczywiście jedynym problemem jest posiadanie dostawcy usług JNDI; Wspaniałą rzeczą jest to, że zaskakująco łatwe jest samodzielne toczenie. Po tym wszystkim można kodować dowolną instancję Javy do XML przy użyciu JavaBeans XMLEncoder i XMLDecoder: nie trzeba polegać na pracy na serwerze aplikacji!

Jaka jest różnica między tymi plikami konfiguracyjnymi? Cóż, może być znacznie czystsze, ponieważ wszystkie aplikacje mogą uzyskać konfigurację od w tym samym miejscu. Jeśli trzeba udostępnić informacje konfiguracyjne (np. Lokalizacje bazy danych), to można je zdefiniować raz w JNDI. Załóżmy, że przenosiłeś serwery baz danych: nie musisz pamiętać plików konfiguracyjnych gazillion z lokalizacją w nim. Po prostu przejdź do jednego miejsca: JNDI.

3

JNDI pozwala uprościć konstrukt zasobów tylko w postaci o nazwie. Tak więc, jest wiele szczegółów grupa na 1 dla wygody/bezpieczeństwa/etc. (Aka warstwa abstrakcji)

zrealizować: skonfigurować listę właściwości, które odpowiada predefiniowanych pól w kontekście JNDI interfejsu.(Te właściwości określić ustawienia dla realizacji JNDI, ale * nie nazwa 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*"); 

idealnie, wyspecjalizowaną funkcję istniałby utrzymać katalogu LDAP, DNS, itp, w swojej organizacji (tak jednolity pojedynczy mapowania określone usługi wszystkim zmniejszenie rozbieżności)

Lista JNDI usługodawców: https://www.ibm.com/support/knowledgecenter/en/SSVSD8_8.4.1/com.ibm.websphere.dtx.adapjndi.doc/concepts/c_jndi_JNDI_Service_Providers_.htm

9

JNDI to API umożliwia dostęp do katalogu i usług nazewnictwa (czyli środki, za pomocą których nazwy są związane z obiektami). Powiązanie nazwy z obiektem nazywa się wiązaniem.

Podstawowym przykładem usługi nazewnictwa jest DNS, który odwzorowuje nazwy komputerów na adresy IP.

Za pomocą JNDI aplikacje mogą przechowywać i pobierać określone obiekty Java dowolnego typu.

W kontekście języka Java może to być używane w plikach konfiguracyjnych, w których nie chcesz tworzyć ściśle określonych zmiennych środowiskowych.

Wiosna Przykład:

plik kontekst Wiosna

<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 plik kontekst

<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"/>