คุณจะตระหนักถึงการใช้งาน JNDI พร้อมตัวอย่างได้อย่างไร?
คุณจะตระหนักถึงการใช้งาน JNDI พร้อมตัวอย่างได้อย่างไร?
คำตอบ:
JNDI คือ Java Naming และ Directory Interface โดยจะใช้ในการแยกความกังวลของโปรแกรมนักพัฒนาและการประยุกต์ใช้Deployer เมื่อคุณเขียนแอปพลิเคชันที่อาศัยฐานข้อมูลคุณไม่จำเป็นต้องกังวลเกี่ยวกับชื่อผู้ใช้หรือรหัสผ่านสำหรับการเชื่อมต่อกับฐานข้อมูลนั้น JNDI อนุญาตให้นักพัฒนาตั้งชื่อให้กับฐานข้อมูลและพึ่งพาตัวปรับใช้เพื่อแมปชื่อนั้นกับอินสแตนซ์จริงของฐานข้อมูล
ตัวอย่างเช่นหากคุณกำลังเขียนโค้ดที่รันในคอนเทนเนอร์ Java EE คุณสามารถเขียนสิ่งนี้เพื่อรับแหล่งข้อมูลที่มีชื่อ 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
}
โปรดทราบว่าไม่มีอะไรเกี่ยวกับไดรเวอร์ฐานข้อมูลหรือชื่อผู้ใช้หรือรหัสผ่านที่นี่ ที่กำหนดค่าไว้ภายในคอนเทนเนอร์
JNDI ไม่ถูก จำกัด ไว้ที่ฐานข้อมูล (JDBC); สามารถตั้งชื่อบริการได้ทุกประเภท สำหรับรายละเอียดเพิ่มเติมคุณควรตรวจสอบของออราเคิลกวดวิชา
JNDI เป็นกลไกที่มีประสิทธิภาพมากสำหรับทั้งการจัดระเบียบข้อมูลการกำหนดค่าการค้นพบและรับฟังบริการผ่านการใช้ไฟล์EventContext
. ใน JNDI คุณสามารถค้นหาและฟังวัตถุใด ๆ (ไม่ใช่แค่DataSource
s) โดยสมมติว่าผู้ให้บริการ JNDI ของคุณรองรับ
แน่นอนปัญหาเดียวคือการมีผู้ให้บริการ JNDI สิ่งที่ยอดเยี่ยมเกี่ยวกับเรื่องนี้คือการม้วนของคุณเองได้ง่ายอย่างน่าประหลาดใจ ท้ายที่สุดคุณสามารถเข้ารหัสอินสแตนซ์ Java ใด ๆเพื่อXML
ใช้ JavaBeans XMLEncoder
และXMLDecoder
: คุณไม่จำเป็นต้องพึ่งพาการทำงานภายในแอปพลิเคชันเซิร์ฟเวอร์!
อะไรคือความแตกต่างระหว่างสิ่งนี้กับไฟล์คอนฟิกูเรชัน? ดีก็สามารถทำความสะอาดมากเพราะทุกการใช้งานของคุณจะได้รับการกำหนดค่าของพวกเขาจากสถานที่เดียวกัน หากพวกเขาต้องการข้อมูลการกำหนดค่าหุ้น (สถานที่เช่นฐานข้อมูล) แล้วนี้สามารถกำหนดครั้งเดียวใน JNDI สมมติว่าคุณย้ายเซิร์ฟเวอร์ฐานข้อมูล: คุณไม่จำเป็นต้องจำไฟล์ config gazillion ที่มีตำแหน่งอยู่ในนั้น คุณไปที่เดียว: JNDI
JNDI เป็น API ที่ใช้ในการเข้าถึงไดเร็กทอรีและบริการการตั้งชื่อ (เช่นหมายถึงชื่อที่เชื่อมโยงกับอ็อบเจ็กต์) การเชื่อมโยงของชื่อกับวัตถุเรียกว่าการผูก
ตัวอย่างพื้นฐานของบริการตั้งชื่อคือ DNS ซึ่งแมปชื่อเครื่องกับที่อยู่ IP
การใช้ JNDI แอ็พพลิเคชันสามารถจัดเก็บและดึงอ็อบเจ็กต์ Java ที่มีชื่อประเภทใดก็ได้
ภายในบริบทของ java สิ่งนี้สามารถใช้ในไฟล์กำหนดค่าที่คุณไม่ต้องการตัวแปรเฉพาะสภาพแวดล้อมฮาร์ดโค้ด
ตัวอย่างฤดูใบไม้ผลิ:
ไฟล์บริบท Spring
<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
<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 ช่วยให้การสร้างทรัพยากรเป็นเพียงชื่อง่ายขึ้น ดังนั้นจึงมีการจัดกลุ่มรายละเอียดมากมายเป็น 1 เพื่อความสะดวก / ความปลอดภัย / ฯลฯ (หรือที่เรียกว่าเลเยอร์นามธรรม)
สิ่งที่ต้องทราบ: ตั้งค่ารายการคุณสมบัติที่สอดคล้องกับฟิลด์ที่กำหนดไว้ล่วงหน้าใน Jndi Context Interface (คุณสมบัติเหล่านี้ระบุการตั้งค่าสำหรับการดำเนินการ jndi แต่ * ไม่ใช่ชื่อการค้นหา)
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*");
ตามหลักการแล้วฟังก์ชันพิเศษจะมีอยู่เพื่อรักษาไดเร็กทอรี LDAP, DNS และอื่น ๆ ในองค์กรของคุณ (ดังนั้นบริการชุดการแมปเดียวแบบรวมทั้งหมดจึงช่วยลดความคลาดเคลื่อนได้)
รายชื่อผู้ให้บริการ 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