Jak możesz zrealizować użycie JNDI, z przykładem, jeśli to możliwe?
Jak możesz zrealizować użycie JNDI, z przykładem, jeśli to możliwe?
Odpowiedzi:
JNDI to Java Naming and Directory Interface. Służy do oddzielenia obaw twórcy aplikacji od osoby wdrażającej aplikację . Kiedy piszesz aplikację, która opiera się na bazie danych, nie powinieneś martwić się o nazwę użytkownika lub hasło do łączenia się z tą bazą danych. JNDI pozwala programistom nadać nazwę bazie danych i polegać na wdrażającym, aby odwzorować tę nazwę na rzeczywistą instancję bazy danych.
Na przykład, jeśli piszesz kod działający w kontenerze Java EE, możesz napisać to, aby uzyskać źródło danych o nazwie 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
}
Zauważ, że nie ma tu nic na temat sterownika bazy danych, nazwy użytkownika ani hasła. To jest skonfigurowane wewnątrz kontenera.
JNDI nie ogranicza się do baz danych (JDBC); można nadać nazwy wszystkim rodzajom usług. Aby uzyskać więcej informacji, zapoznaj się z samouczkiem Oracle .
JNDI to bardzo potężny mechanizm służący zarówno do organizowania informacji konfiguracyjnych, jak i do wykrywania usług oraz nasłuchiwania ich za pośrednictwem EventContext
. W JNDI można wyszukiwać i nasłuchiwać dowolnego obiektu (nie tylko obiektów DataSource
), zakładając, że obsługuje go dostawca usług JNDI.
Oczywiście jedynym problemem jest faktyczne posiadanie dostawcy usług JNDI; wspaniałą rzeczą w tym jest to, że zaskakująco łatwo jest toczyć własny. Po tym wszystkim można zakodować każdą instancję Java w XML
użyciu JavaBeans XMLEncoder
i XMLDecoder
: nie trzeba polegać na prowadzeniu w ramach serwera aplikacji!
Więc jaka jest różnica między tym a posiadaniem plików konfiguracyjnych? Cóż, może być znacznie czystszy, ponieważ wszystkie aplikacje mogą uzyskać konfigurację z tego samego miejsca . Jeśli potrzebują współużytkować informacje konfiguracyjne (np. Lokalizacje baz danych), można to zdefiniować raz w JNDI . Przypuśćmy, że przeniosłeś serwery baz danych: nie musisz pamiętać plików konfiguracyjnych Gazillion z ich lokalizacją. Po prostu udajesz się w jedno miejsce: JNDI.
JNDI jest interfejsem API używanym do uzyskiwania dostępu do usług katalogowych i nazewnictwa (tj. Środków, za pomocą których nazwy są kojarzone z obiektami). Powiązanie nazwy z obiektem nazywane jest wiązaniem.
Podstawowym przykładem usługi nazewnictwa jest DNS, który odwzorowuje nazwy komputerów na adresy IP.
Korzystając z JNDI, aplikacje mogą przechowywać i pobierać nazwane obiekty Java dowolnego typu.
W kontekście Java może to być używane w plikach konfiguracyjnych, w których nie chcesz na stałe kodować zmiennych specyficznych dla środowiska.
Przykład wiosny:
Plik kontekstu sprężyny
<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 kontekstu 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"/>
JNDI umożliwia uproszczenie konstrukcji zasobu do samej nazwy . Tak więc wiele szczegółów jest zgrupowanych w 1 dla wygody / bezpieczeństwa / itp. (inaczej warstwa abstrakcji)
do zrealizowania: skonfiguruj listę właściwości, która odpowiada predefiniowanym polom w Jndi Context Interface. (te właściwości określają ustawienia wykonania 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 byłoby, gdyby istniała wyspecjalizowana funkcja do utrzymywania katalogu LDAP, DNS itp. w Twojej organizacji (więc ujednolicony pojedynczy zestaw mapowania obsługuje wszystko, zmniejszając 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