Co to jest JNDI? Jakie jest jego podstawowe zastosowanie? Kiedy jest używany?


Odpowiedzi:


241

Co to jest JNDI?

Oznacza nazewnictwo Java i interfejs katalogu .

Jakie jest jego podstawowe zastosowanie?

JNDI pozwala aplikacjom rozproszonym na wyszukiwanie usług w abstrakcyjny, niezależny od zasobów sposób.

Kiedy jest używany?

Najczęstszym przypadkiem użycia jest skonfigurowanie puli połączeń z bazą danych na serwerze aplikacji Java EE. Każda aplikacja wdrożona na tym serwerze może uzyskać dostęp do potrzebnych połączeń przy użyciu nazwy JNDI java:comp/env/FooBarPoolbez konieczności poznawania szczegółów połączenia.

Ma to kilka zalet:

  1. Jeśli masz sekwencję wdrażania, w której aplikacje przenoszą się ze devl->int->test->prodśrodowisk, możesz użyć tej samej nazwy JNDI w każdym środowisku i ukryć używaną bazę danych. Aplikacje nie muszą się zmieniać podczas migracji między środowiskami.
  2. Możesz zminimalizować liczbę osób, które muszą znać poświadczenia dostępu do produkcyjnej bazy danych. Tylko serwer aplikacji Java EE musi wiedzieć, czy korzystasz z JNDI.

9
więc jest to w zasadzie bezpieczniejsza alternatywa dla posiadania pliku właściwości z informacjami o połączeniu jdbc?
uśmiechnął się

4
@grinch: Zasadniczo tak. Jest bezpieczniejszy i bardziej znormalizowany, co ułatwia wdrożenie (nie trzeba zgadywać, jaka musi być nazwa pliku właściwości itp.).
śleske,

Jaka jest zatem różnica między używaniem zmiennych środowiskowych a JNDI? Czy to podobna koncepcja?
skryvets

100

Co to jest JNDI?

Java Naming and Directory Interface TM (JNDI) to interfejs programowania aplikacji (API), który zapewnia funkcje nazewnictwa i katalogowania aplikacjom napisanym przy użyciu języka programowania Java TM . Jest zdefiniowany jako niezależny od konkretnej implementacji usługi katalogowej. W ten sposób można uzyskać dostęp do różnych katalogów (nowych, powstających i już wdrożonych) we wspólny sposób.

Jakie jest jego podstawowe zastosowanie?

Większość z nich jest ujęta w powyższej odpowiedzi, ale chciałbym przedstawić tutaj architekturę, aby powyższe miało więcej sensu.

wprowadź opis zdjęcia tutaj

Aby korzystać z JNDI, musisz mieć klasy JNDI i co najmniej jednego dostawcę usług. Zestaw Java 2 SDK, wersja 1.3 zawiera trzech dostawców usług dla następujących usług nazewnictwa / usług katalogowych:

  1. Lightweight Directory Access Protocol (LDAP)
  2. Common Name Request Broker Architecture (CORBA) Usługa nazw Common Object Services (COS)
  3. Rejestr Java Remote Method Invocation (RMI)

Zasadniczo tworzysz obiekty i rejestrujesz je w usługach katalogowych, które możesz później wyszukać i wykonać operację.


30

JNDI w kategoriach laika jest w zasadzie interfejsem umożliwiającym uzyskanie instancji zasobów wewnętrznych / zewnętrznych, takich jak

  javax.sql.DataSource, 
  javax.jms.Connection-Factory,
  javax.jms.QueueConnectionFactory,
  javax.jms.TopicConnectionFactory,
  javax.mail.Session, java.net.URL,
  javax.resource.cci.ConnectionFactory,

lub dowolny inny typ zdefiniowany przez adapter zasobów JCA. Zapewnia składnię umożliwiającą tworzenie dostępu, niezależnie od tego, czy są one wewnętrzne, czy zewnętrzne. tj. (comp / env w tym przypadku oznacza, gdzie komponent / środowisko istnieje wiele innych składni):

jndiContext.lookup("java:comp/env/persistence/customerDB");

1
To tylko część obrazu. JNDI pozwala wyszukiwać obiekty Java - mogą to być zasoby takie jak DataSource lub coś innego, a nawet zwykłe java.lang.Stringinformacje konfiguracyjne.
śleske,

3
@sleske Sugeruję więc, abyś sam udzielił odpowiedzi.
Ced

14

Przegląd JNDI

JNDI to interfejs API określony w technologii Java, który zapewnia funkcje nazewnictwa i katalogowania aplikacjom napisanym w języku programowania Java. Jest zaprojektowany specjalnie dla platformy Java z wykorzystaniem modelu obiektowego Java. Za pomocą JNDI aplikacje oparte na technologii Java mogą przechowywać i pobierać nazwane obiekty Java dowolnego typu. Ponadto JNDI zapewnia metody wykonywania standardowych operacji na katalogach, takich jak kojarzenie atrybutów z obiektami i wyszukiwanie obiektów za pomocą ich atrybutów.

JNDI jest również definiowany niezależnie od konkretnej implementacji nazewnictwa lub usługi katalogowej. Umożliwia aplikacjom dostęp do różnych, prawdopodobnie wielu usług nazewnictwa i usług katalogowych za pomocą wspólnego interfejsu API. Za tym wspólnym interfejsem API można bezproblemowo podłączyć różnych dostawców nazewnictwa i usług katalogowych. Umożliwia to aplikacjom opartym na technologii Java korzystanie z informacji z różnych istniejących usług nazewnictwa i usług katalogowych, takich jak LDAP, NDS, DNS i NIS (YP), a także umożliwia aplikacjom współistnienie ze starszym oprogramowaniem i systemami.

Używając JNDI jako narzędzia, możesz budować nowe potężne i przenośne aplikacje, które nie tylko wykorzystują model obiektowy Javy, ale są również dobrze zintegrowane ze środowiskiem, w którym są wdrażane.

Odniesienie


9

Co to jest JNDI?

JNDI oznacza Java Naming and Directory Interface. Jest standardowo wyposażony w J2EE.

Jakie jest jego podstawowe zastosowanie?

Dzięki temu API możesz uzyskać dostęp do wielu rodzajów danych, takich jak obiekty, urządzenia, pliki nazw i usługi katalogowe, np. jest używany przez EJB do wyszukiwania zdalnych obiektów. JNDI został zaprojektowany w celu zapewnienia wspólnego interfejsu dostępu do istniejących usług, takich jak DNS, NDS, LDAP, CORBA i RMI.

Kiedy jest używany?

Możesz użyć JNDI do wykonywania operacji nazewnictwa, w tym operacji odczytu i operacji aktualizowania przestrzeni nazw. Następujące operacje są opisane tutaj .


7

Usługa nazewnictwa kojarzy nazwy z obiektami i znajduje obiekty na podstawie ich nazw (rejestr RMI jest dobrym przykładem usługi nazewnictwa). JNDI zapewnia wspólny interfejs wielu istniejących usług nazewnictwa, takich jak LDAP, DNS.

Bez JNDI informacje o lokalizacji lub dostępie do zasobów zdalnych musiałyby zostać zakodowane na stałe w aplikacjach lub udostępnione w konfiguracji. Utrzymywanie tych informacji jest dość żmudne i podatne na błędy.


3

Jestem tylko ciekawy, dlaczego oficjalne dokumenty są tak ignorowane, które już drobiazgowo opracowują szczegóły.

Ale jeśli chcesz zrozumieć przypadki, zapoznaj się z odpowiedzią duffymo .

Java Naming and Directory Interface TM (JNDI) to interfejs programowania aplikacji (API), który zapewnia funkcje nazewnictwa i katalogowania aplikacjom napisanym przy użyciu języka programowania Java TM . Jest zdefiniowany jako niezależny od konkretnej implementacji usługi katalogowej. W ten sposób można uzyskać dostęp do różnych katalogów - nowych, powstających i już wdrożonych - w wspólny sposób.

I jego architektura

wprowadź opis zdjęcia tutaj

I zwykle jak go używasz .


5
I am just curious why the official docs are so ignored which elaborate the details meticulously alreadyMoże dlatego, że nie wyjaśniają w sposób wystarczający, aby zwykli ludzie mogli to zrozumieć?
skryvets

1

Posłużę się jednym przykładem, aby wyjaśnić, w jaki sposób JNDI może zostać użyty do skonfigurowania bazy danych bez znajomości nazwy użytkownika i hasła bazy danych przez programistę aplikacji.

1) Skonfigurowaliśmy źródło danych w standalone-full.xml serwera JBoss . Dodatkowo możemy również skonfigurować szczegóły puli.

 <datasource jta="false" jndi-name="java:/DEV.DS" pool-name="DEV" enabled="true" use-ccm="false">
                <connection-url>jdbc:oracle:thin:@<IP>:1521:DEV</connection-url>
                <driver-class>oracle.jdbc.OracleDriver</driver-class>
                <driver>oracle</driver>
                <security>
                    <user-name>usname</user-name>
                    <password>pass</password>
                    </security>
                    <security>

 <security-domain>encryptedSecurityDomain</security-domain>
                    </security>

                <validation>
                    <validate-on-match>false</validate-on-match>
                    <background-validation>false</background-validation>
                    <background-validation-millis>1</background-validation-millis>
                </validation>
                <statement>
                    <prepared-statement-cache-size>0</prepared-statement-cache-size>
                    <share-prepared-statements>false</share-prepared-statements>
                    <pool>
                        <min-pool-size>5</min-pool-size>
                        <max-pool-size>10</max-pool-size>
                    </pool>
                </statement>
            </datasource>

wprowadź opis zdjęcia tutaj

Teraz ta nazwa jndi i powiązany z nią obiekt źródła danych będą dostępne dla naszego application.application.

2) Możemy pobrać ten obiekt źródła danych za pomocą klasy JndiDataSourceLookup.

wprowadź opis zdjęcia tutaj

Wiosna utworzy instancję komponentu bean źródła danych po tym, jak podamy nazwę jndi.

Teraz możemy zmienić rozmiar puli, nazwę użytkownika lub hasło zgodnie z naszym środowiskiem lub wymaganiami, ale nie wpłynie to na aplikację.

Uwaga : encryptedSecurityDomain, musimy skonfigurować go osobno na serwerze JBoss, takim jak

<security-domain name="encryptedSecurityDomain" cache-type="default">
                    <authentication>
                        <login-module code="org.picketbox.datasource.security.SecureIdentityLoginModule" flag="required">
                            <module-option name="username" value="<usernamefordb>"/>
                            <module-option name="password" value="894c8a6aegc8d028ce169c596d67afd0"/>
                        </login-module>
                    </authentication>
                </security-domain>

To jeden z przypadków użycia. Mam nadzieję, że to wyjaśni.


0

Najlepsze wyjaśnienie znajduje się tutaj

Co to jest JNDI

Jest to interfejs API zapewniający dostęp do usługi katalogowej, to znaczy nazwy odwzorowania usługi (ciągów) z obiektami, odniesienia do obiektów zdalnych lub prostych danych . To się nazywa wiązanie. Zestaw powiązań nazywany jest kontekstem . Aplikacje używają interfejsu JNDI do uzyskiwania dostępu do zasobów.

Mówiąc najprościej, to jest jak skrót mapy z kluczem String i wartościami Object reprezentującymi zasoby w sieci.

Jakie problemy rozwiązuje JNDI

Bez JNDI informacje o lokalizacji lub dostępie do zasobów zdalnych musiałyby zostać zakodowane na stałe w aplikacjach lub udostępnione w konfiguracji. Utrzymywanie tych informacji jest dość żmudne i podatne na błędy.

Jeśli zasoby zostały przeniesione na inny serwer, na przykład z innym adresem IP, wszystkie aplikacje korzystające z tego zasobu musiałyby zostać zaktualizowane o te nowe informacje. W przypadku JNDI nie jest to konieczne. Tylko odpowiednie powiązanie zasobów musi zostać zaktualizowane. Aplikacje mogą nadal uzyskiwać do niej dostęp za pomocą swojej nazwy, a przeniesienie jest przezroczyste.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.