Java elnevezés és címtárfelület áttekintése
1. Bemutatkozás
A Java elnevezési és könyvtárfelület (JNDI) biztosítja a név- és / vagy címtárszolgáltatások következetes használatát Java API-ként. Ez a felület használható objektumok megkötésére, objektumok felkutatására vagy lekérdezésére, valamint ugyanazon objektumok változásainak észlelésére.
Míg a JNDI használata a támogatott elnevezési és címtárszolgáltatások sokféle listáját tartalmazza, ebben az oktatóanyagban a JDBC-re koncentrálunk, miközben a JNDI API-ját fedezzük fel.
2. JNDI Leírás
A JNDI-vel végzett bármilyen munka megköveteli az alapul szolgáló szolgáltatás megértése továbbá hozzáférhető megvalósítás. Például egy adatbázis-csatlakozási szolgáltatás megköveteli az adott tulajdonságokat és a kivételkezelést.
A JNDI absztrakciója azonban leválasztja a kapcsolat konfigurációját az alkalmazásról.
Fedezzük fel Név és Kontextus, amelyek a JNDI alapvető funkcióit tartalmazzák.
2.1. Név Felület
Név objectName = új összetett név ("java: comp / env / jdbc");
A Név Az interfész lehetővé teszi a JNDI nevek összetevőinek és szintaxisainak kezelését. A karakterlánc első tokenje a globális kontextust reprezentálja, utána minden hozzáadott karakterlánc a következő részkontextust képviseli:
Felsorolási elemek = objectName.getAll (); while (elements.hasMoreElements ()) {System.out.println (elements.nextElement ()); }
Kimenetünk a következőképpen néz ki:
java: comp env jdbc
Ahogy látjuk, / a határoló Név részkörnyezetek. Most adjunk hozzá egy alkörnyezetet:
objectName.add ("példa");
Ezután teszteljük a kiegészítést:
assertEquals ("példa", objectName.get (objectName.size () - 1));
2.2. Kontextus Felület
Kontextus tartalmazza az elnevezési és címtárszolgáltatás tulajdonságait. Itt a kényelem érdekében használjunk néhány Spring segédkódot a Kontextus:
SimpleNamingContextBuilder builder = új SimpleNamingContextBuilder (); építő.aktivál ();
Tavaszi SimpleNamingContextBuilder létrehoz egy JNDI szolgáltatót, majd aktiválja a készítőt a NamingManager:
JndiTemplate jndiTemplate = new JndiTemplate (); ctx = (InitialContext) jndiTemplate.getContext ();
Végül, JndiTemplate segít elérni a InitialContext.
3. JNDI objektumkötés és keresés
Most, hogy láttuk, hogyan kell használni Név és Kontextus, használjuk a JNDI-t egy JDBC tárolásához Adatforrás:
ds = new DriverManagerDataSource ("jdbc: h2: mem: mydb");
3.1. JNDI objektumok megkötése
Mivel van kontextusunk, kössük hozzá az objektumot:
ctx.bind ("java: comp / env / jdbc / datasource", ds);
Általánosságban elmondható, hogy a szolgáltatásoknak objektum hivatkozást, sorosított adatokat vagy attribútumokat kell tárolniuk egy könyvtár kontextusban. Mindez az alkalmazás igényeitől függ.
Vegye figyelembe, hogy a JNDI ilyen módon történő használata ritkább. Általában a JNDI kapcsolódik az alkalmazások futásidején kívül kezelt adatokhoz.
Ha azonban az alkalmazás már létrehozhatja vagy megtalálhatja Adatforrás, könnyebb lehet ezt bekötni a Spring segítségével. Ezzel szemben, ha valami az alkalmazásunkon kívüli objektumokat köt a JNDI-be, akkor az alkalmazás elfogyaszthatja azokat.
3.2. JNDI objektumok felkutatása
Nézzünk utána Adatforrás:
DataSource ds = (DataSource) ctx.lookup ("java: comp / env / jdbc / datasource");
És akkor teszteljük annak biztosítását Adatforrás a várakozásoknak megfelelően:
assertNotNull (ds.getConnection ());
4. Gyakori JNDI kivételek
A JNDI-vel való együttműködés időnként futásidejű kivételeket eredményezhet. Íme néhány gyakori.
4.1. NameNotFoundException
ctx.lookup ("badJndiName");
Mivel ez a név ebben a kontextusban nincs kötve, a verem nyomát látjuk:
javax.naming.NameNotFoundException: A név [badJndiName] nincs kötve; 0 kötés: [] az org.springframework.mock.jndi.SimpleNamingContext.lookup (SimpleNamingContext.java:140) címen: java.naming / javax.naming.InitialContext.lookup (InitialContext.java:409)
Meg kell jegyeznünk, hogy a verem nyomkövetése az összes objektumot tartalmazza, ami hasznos annak felderítéséhez, hogy miért történt a kivétel.
4.2. NoInitialContextException
Bármilyen kölcsönhatás a InitialContext dobhat NoInitialContextException:
assertThrows (NoInitialContextException.class, () -> {JndiTemplate jndiTemplate = new JndiTemplate (); InitialContext ctx = (InitialContext) jndiTemplate.getContext (); ctx.lookup ("java: comp / env / jvd / jvd"; .printStackTrace ();
Meg kell jegyeznünk, hogy a JNDI ilyen használata érvényes, mivel korábban használtuk. Ezúttal azonban nincs JNDI-kontextusszolgáltató, és kivétel lesz:
javax.naming.NoInitialContextException: Meg kell adni az osztály nevét a környezetben vagy a rendszer tulajdonságában, vagy egy alkalmazás erőforrás fájljában: java.naming.factory.initial at java.naming / javax.naming.spi.NamingManager.getInitialContext (NamingManager.java: 685)
5. A JNDI szerepe a modern alkalmazásarchitektúrában
Míg A JNDI kevésbé játszik szerepet a könnyű, konténeres Java alkalmazásokban mint például a Spring Boot, vannak más felhasználási lehetőségek is. Három Java technológia, amely még mindig használja a JNDI-t, a JDBC, az EJB és a JMS. A Java vállalati alkalmazások széles skáláját használják.
Például egy külön DevOps csapat kezelheti a környezeti változókat, például a felhasználónevet és a jelszót egy érzékeny adatbázis-kapcsolat számára minden környezetben. JNDI-erőforrás létrehozható a webalkalmazás-tárolóban, a JNDI-t következetes absztrakciós rétegként használva, amely minden környezetben működik.
Ez a beállítás lehetővé teszi a fejlesztők számára, hogy fejlesztési célokból helyi definíciót hozzanak létre és vezérelhessenek, miközben a termelési környezet érzékeny erőforrásaihoz kapcsolódnak ugyanazon JNDI néven keresztül.
6. Következtetés
Ebben az oktatóanyagban láttunk egy objektumot összekapcsolni, összekötni és megkeresni a Java elnevezési és címtárfelület használatával. Megnéztük a JNDI által felvetett általános kivételeket is.
Végül megvizsgáltuk, hogy a JNDI hogyan illeszkedik a modern alkalmazás architektúrájába.
Mint mindig, a kód elérhető a GitHubon.