JNDI에 대한 일반적인 이해 :
JNDI (Java Naming and Directory Interface) 이름 지정 및 디렉토리 서비스를 사용하는 인터페이스 세트를 제공합니다. 사용자는이를 통해 이름 지정 및 디렉토리 서비스를 사용할 수 있습니다. JDBC처럼. JNDI는 두 부분이 포함되어 있습니다. 명명 된 서비스 및 디렉토리 서비스, 여기서 디렉토리 서비스에는 여러 속성 객체가 포함 된 디렉토리 객체 디렉토리 개체가 포함되어 있습니다. 속성에 대한 많은 작업을 제공합니다.
이름 지정 및 디렉토리 서비스 :
운영 체제 파일 시스템과 같은 명명 및 디렉토리 서비스를 사용하여 작업, 쿼리, 추가 및 파일 삭제와 같은 기능을 제공합니다. DNS 서비스는 URL과 IP 주소를 결합시킵니다. 이름 지정 및 디렉토리 시스템의 가장 중요한 기능은 이름과 객체를 바인딩하는 것입니다. 그것에 기초하여, 조회 및 검색과 같은 더 많은 기능을 제공합니다. 또한 저장된 객체에는 특정 계층이 있습니다. 이러한 서비스를 사용하여 객체를보다 효과적으로 관리하고 운영 할 수 있습니다.
이름 지정 서비스는 이름을 객체에 매핑합니다. RMI 레지스트리 및 Corba 이름 지정 서비스는 모두 이름 지정 서비스입니다.
디렉토리 서비스는 또한 개체를 저장하지만 디렉토리 서비스는 이러한 객체의 관련 속성을 인식합니다. 프로젝트 속성을 사용하여 디렉토리를 검색 할 수 있습니다.
1990 년대 초, Lightweight Directory Access Protocol (LightweightDireToryAccessProtocol)은 표준 디렉토리 프로토콜로 개발되었으며 JNDI는 LDAP에 액세스 할 수있었습니다.
J2SE는 JNDI에 5 개의 확장 패키지를 제공합니다.
컨텍스트 : 컨텍스트는 계층 또는 디렉토리로 이해 될 수있는 이름 간의 바인딩 세트입니다. 또한 다음 하위 텍스트 계층을 포함 할 수도 있습니다. 이름 지정 및 디렉토리 서비스를 사용할 때 초기 컨텍스트를 얻는 것은 전체 네임 스페이스 작업에 대한 입력입니다. 디렉토리 서비스에서는 DirContext입니다.
JNDI (Java Naming and Directory Interface)는 다양한 명명 및 디렉토리 서비스를 찾고 액세스 할 수있는 공통 및 통합 인터페이스를 개발자에게 제공하는 응용 프로그램 디자인 API입니다. JDBC는 추상화 레이어를 기반으로합니다.
JNDI가 액세스 할 수있는 기존 디렉토리 및 서비스는 다음과 같습니다.
DNS, Xnam, Novell Directory Service, LDAP (Lightweight Directory Access Protocol), CORBA 객체 서비스, 파일 시스템, Windows XP/2000/NT/ME/9X 레지스트리, RMI, DSML V1 & V2, NIS.
JNDI의 장점 :
여기에는 공통 인터페이스를 사용하여 다양한 유형의 서비스에 액세스하기 위해 많은 이름 지정 및 디렉토리 서비스가 포함되어 있습니다. 동시에 여러 명명 또는 디렉토리 서비스에 연결할 수 있습니다. 논리적 연관성을 설정하여 이름이 물체 나 리소스의 물리적 ID를 안내하지 않고도 Java 객체 또는 리소스와 연관 될 수 있도록합니다.
JNDI 패키지 :
JNDI vs. JDBC :
JNDI는 네트워크에서 서비스를 찾고 액세스하는 통일 된 방법을 제공합니다. 데이터베이스 또는 이름 지정 서비스의 레코드에 해당하는 리소스 이름을 지정하면 데이터베이스 연결 설정에 필요한 정보를 반환합니다.
Code example:
{context cntxt = new InitialContext (); DataSource ds = (dataSource) cntxt.lookup ( "jdbc/dpt");} catch (namingexception ne) {...} JNDI 및 JMS :
메시지 통신은 소프트웨어 구성 요소 또는 응용 프로그램이 통신하기 위해 사용하는 방법입니다. JMS는 응용 프로그램이 메시지를 작성, 전송, 수신 및 읽을 수있는 Java 기술입니다.
Code example:
try {properties env = new Properties (); initialContext inictxt = new InitialContext (ENV); topicconnectionFactory connfactory = (TopicConnectionFactory) inictxt.lookup ( "ttopiceConnectionFactory"); ...} catch (namingexception ne) {...} 특정 디렉토리 방문 : 예를 들어, 사람은 객체이며, 사람의 이름, 전화 번호, 이메일 주소, 우편 번호 및 기타 속성과 같은 몇 가지 속성이 있습니다. getAttributes () 메소드에 의해
Attribute attr = directory.getAttributes (personname) .get ( "email"); String email = (String) attr.get ();
JNDI를 사용하여 고객이 개체의 이름이나 속성을 사용하여 개체를 찾을 수 있도록합니다.
foxes = directory.search ( "o = wiz, c = us", "sn = fox", controls);
JNDI를 사용하여 프린터 및 데이터베이스와 같은 개체를 찾아 프린터를 찾는 예 :
프린터 프린터 = (프린터) namespace.lookup (printername); printer.print (문서);
네임 스페이스 찾아보기 :
namingEnumeration list = namespace.list ( "o = 위젯, c = us"); while (list.hasmore ()) {nameclasspair entry = (nameclasspair) list.next (); display (enther.getName (), enther.getClassName ());}코드 예 : 이름, 클래스 이름 및 바운드 객체를 다시 구입하십시오.
namingEnumeration namenumlist = ctxt.listbinding ( "cntxtname"); ... while (namenumlist.hasmore ()) {binding bnd = (바인딩) namenumlist.next (); String sobjname = bnd.getname (); stringjlocal = bnd.getclassname = bnd.getclassname = bnd.get. (someObject) bnd.getObject ();} 이름 서비스 및 디렉토리 서비스의 개념을 이해하면 JNDI를 더 잘 사용하는 데 도움이됩니다. 이름 지정 서비스 이름 서비스는 이름을 객체와 연결하는 방법과 이름을 통해 객체를 찾는 방법을 정의합니다. 일반적인 예는 다음과 같습니다. DNS는 도메인 이름을 IP와 연결하고 파일 시스템을 파일 이름과 연관시킵니다. 이름 서비스에서 주요 개념 :
- 이름 (이름), 파일 이름, 도메인 이름 등과 같은 이름 시스템의 실제 객체의 코드 이름은 관련 객체를 찾는 데 사용됩니다. 시스템은 "/"를 사용하여 계층 구조를 나타내는 반면 DNS를 사용하는 반면 "과 같은 다른 시스템마다 명명 사양이 다릅니다.
- 바인딩, 이름의 연관성 및 실제 물체.
- 참조 및 주소. 객체를 이름 시스템에 직접 저장할 수없는 경우 참조를 사용하여 참조를 통해 실제 객체를 찾아야합니다. 시스템에서 저장된 참조의 내용을 주소라고합니다. 인용문에는 또 다른 용도가 있습니다. 이름 시스템에서는 관계형 데이터베이스의 외래 키의 개념이 부족합니다. 참조를 사용하면 외국 키의 대안으로 사용할 수 있습니다.
-컨텍스트, 이름-객체 컬렉션으로, 검색, 바인딩 및 탈지와 같은 이름 시스템과 상호 작용할 수있는 주요 작업을 제공합니다. 아동 컨텍스트 (하위 텍스트) 간의 관계는 파일 시스템의 디렉토리와 하위 디렉토리 간의 관계와 유사합니다. 아동 상황은 맥락에 포함되며 부모 상황에서 이름을 통해 아동 상황과 관련이 있습니다.
- 이름 지정 시스템 및 네임 스페이스. 이름 시스템은 동일한 유형의 컨텍스트 모음이며 이름 서비스를 제공합니다. 이름 공간은 파일 이름 및 파일 시스템 디렉토리와 같은 이름 시스템의 이름 모음입니다.
디렉토리 서비스 디렉토리 서비스는 이름 서비스의 확장입니다. 이름과 개체를 연결하는 것 외에도 객체에 속성을 포함 할 수 있습니다. 디렉토리 시스템은 일반적으로 계층 구조로 데이터를 구성합니다. 디렉토리 서비스의 주요 개념 :
- 디렉토리 객체에 속하는 속성은 (이름, 값) 쌍이며 속성에 여러 값을 가질 수 있습니다.
- 디렉토리 및 디렉토리 서비스, 디렉토리는 디렉토리 개체의 모음입니다. 디렉토리 서비스는 디렉토리 관련 서비스를 제공하여 디렉토리에 저장된 개체의 속성을 생성, 삭제 및 수정할 수있는 디렉토리 관련 서비스를 제공합니다.
- 검색 및 검색 필터, 디렉토리 개체를 얻는 작업은 검색입니다. 필터는 검색 조건과 유사한 객체입니다.
기본 사용
² JNDI 제공 업체 등록 JNDI를 사용하기 전에 JNDI 제공 업체를 확보하여 시스템에 등록해야합니다. JNDI와 관련된 시스템 속성은 javax.naming.context, 일반적으로 사용되는 속성에 정의되어 있습니다.
-java.naming.factory.initial, 서비스 제공 업체가 InitialContext를 생성하기 위해 사용하는 클래스 이름입니다.
-java.naming.provider.url, InitialContext의 초기 URL을 구성하는 데 사용됩니다.
-java.naming.factory.object, nameclasspair 및 참조에 사용되는 이름 to-bobject 맵을 만드는 데 사용되는 클래스입니다.
-java.naming.factory.state, JNDI 상태를 만드는 데 사용되는 클래스. 디렉토리 서비스의 경우 일반적으로 보안 설정이 필요하며 일반적으로 사용됩니다.
-java.naming.security. Authentication, 보안 유형, 세 가지 값 : 없음, 단순하거나 강한.
-java.naming.security.principal, 인증 정보.
-java.naming.security.credentials, 인증서 정보.
-java.naming.security.protocol, 보안 프로토콜 이름.
System.SetProperty에 등록하십시오. 프로그램에 지침이 표시되지 않으면 Java는 등록을 완료하기 위해 ClassPath에서 jdni.properties 파일을 찾습니다. jdni.properties 예 :
java.naming.factory.initial = com.codeline.db.mockinitialContextFactory
연결 서비스
등록 후 서비스 연결을 구현할 수 있습니다. 이름 서비스의 경우 InitialContext로 시작하여 Directory Services를 사용하여 InitialDirconText를 사용하십시오. 그들은 각각 컨텍스트와 Dircontext를 구현합니다. 이 두 인터페이스는 이름 서비스 및 디렉토리 서비스의 인터페이스에 해당하며 JNDI에서 가장 중요한 두 인터페이스이기도합니다.
이름 서비스 연결 :
System.setProperty (context.initial_context_factory, "com.sun.jndi.fscontext.fscontextFactory"); InitialContext CTX = New InitialContext ();
디렉토리 서비스에 연결 :
Hashtable Env = New Hashtable (); Env.put (context.initial_context_factory, "com.sun.jndi.ldap.ldapctxfactory"); env.put (context.provider_url, "ldap : //myserver.com/"); env.put (context.security_authentication, "simple"); // ldap 서버에 로그인하는 데 필요한 사용자 이름은 Env.put (context.security_principal, "ldapuser")입니다. // LDAP에 로그인하여 서버에서 요구하는 비밀번호는 Env.put (context.security_credentials, "mypassword"); InitialDirconText CTX = New InitialDirconText (ENV);
멀티 서비스 제공 업체 : 응용 프로그램에 여러 서비스 제공 업체가 포함 된 경우 연결시 약간 다릅니다. 이름 서비스를 예로 들어보십시오
Hashtable Env = New Hashtable (); Env.put (context.initial_context_fackory, "com.sun.jndi.rmi.registry.registryContextFactory"); env.put (context.provider_url, "rmi : //myserver.com : 1099"); // 다른 생성자 사용 초기 콘텐츠 CTX = New InitialContext (ENV);
물체를 찾으십시오
이름 서비스이든 디렉토리 서비스이든, 조회는 객체를 찾는 데 사용됩니다. String을 매개 변수로 사용하는 것 외에도 Lookup은 이름 인터페이스를 매개 변수로 사용할 수도 있습니다.
greeter greeter = (greeter) ctx.lookup ( "Sayhello");
컨텍스트에서 모든 객체 이름을 얻으려면 LIS를 사용하여 NameClassPair 목록을 반환하십시오. nameclasspair에는 객체 이름과 객체 클래스 이름이 포함되어 있습니다. 실제 객체 인스턴스 목록을 얻으려면 바인딩 목록을 반환하는 ListBindings를 사용하십시오. 바인딩은 객체의 인스턴스를 포함하는 nameclasspair의 서브 클래스입니다.
- 목록
namingEnumeration list = ctx.list ( "awt"); while (list.hasmore ()) {nameclasspair nc = (nameclasspair) list.next (); System.out.println (NC); } - 목록 바인딩
namingenumeration bindings = ctx.listbindings ( "awt"); while (bindings.hasmore ()) {binding bd = (binding) bindings.next (); System.out.println (bd.getName () + ":" + bd.getObject ()); }
객체 바인딩
- 바인드를 사용하여 바인딩을 추가하십시오
과일 과일 = 새로운 과일 ( "오렌지"); ctx.bind ( "좋아하는", 과일);
- 리드 핀을 사용하여 바인딩을 수정하십시오
과일 과일 = 새로운 과일 ( "레몬"); ctx.rebind ( "좋아하는", 과일);
- 바인딩을 제거하려면 바인딩을 제거하십시오.
ctx.unbind ( "좋아하는");
개체의 이름을 바꿉니다
이름 바꾸기를 사용하여 컨텍스트에서 개체의 이름을 바꿉니다
ctx.rename ( "report.txt", "old_report.txt");
- 속성 속성을 얻는 것과 관련된 인터페이스는 속성 및 속성이며, 둘 다 javax.naming.directory 패키지에 있습니다. getAttributes의 dircontext 메소드를 통해 객체의 속성을 설정 한 다음 속성 Get 메소드를 사용하여 해당 속성을 얻을 수 있으며 마지막으로 Get 속성 메소드를 통해 속성 값을 얻을 수 있습니다.
문자열 dn = "uid = me, dc = mycompany, dc = com, ou = customer, o = exampleapp"; 컨텍스트 사용자 = (컨텍스트) ctx.lookup (dn); // 모든 속성 속성을 가져옵니다. attrs = user.getAttributes ( ""); 속성 test = attrs .get ( "test"); Object TestValue = test.get ();
위의 예에서는 사용자의 모든 속성이 얻어집니다. 실제로 사용하면 네트워크 대역폭의 영향을 고려할 때 얻을 속성 목록을 설정할 수 있습니다.
문자열 reqd_attrs = new String [] { "성", "이니셜", "제목", "rfc822mailalias"}; attributes attrs = user.getAttributes ( "", reqd_attrs);
찾아서 필터
검색 방법을 사용하여 완료하십시오.
public dircontext [] findUser (문자열 이니셜, 문자열 성, 문자열 국가, 문자열 폰) {// 구성 조건 Basicattributes search_attrs = new Basicattributes (); search_attrs.put ( "이니셜", 이니셜); search_attrs.put ( "sn", 사건); search_attrs.put ( "c", 국가); if (phone! = null) search_attrs.put ( "phoneNumber", phone); namingEnumeration results = initial_ctx.search ( "ou = customer, o = emabeseapp", search_attrs); linkedlist found = new LinkedList (); while (results.hasmore ()) {searchResults sr = (searchResults) results.next (); 문자열 이름 = sr.getName (); 개체 ctx = sr.getObject (); if ((ctx == null) ||! (ctx instancef dircontext)) found.add (initial_ctx.lookup (name)); else found.add (ctx); } dirContext [] ret_val = new dirContext [found.size ()]; found.toarray (ret_val); Ret_val 리턴; }
DirContext 인터페이스의 주요 필터링 방법 :
1. 필터 문자열을 사용하십시오
문자열 reqd_attrs = new String [] { "cn", "uid", "rfc822mailalias"}; namingEnumeration results = initial_ctx.search ( "ou = customer, o = exampleApp", search_attrs, reqd_attrs);
2. SearchControls를 사용하여 더 많은 제어를 얻으십시오
SearchControls Ctrls = New SearchControls (); ctrls.setCountLimit (20); ctrls.settimelimit (5000); ctrls.setsearchscope (searchControls.subtree_scope); namingEnumeration results = initial_ctx.search ( "cat = books, ou = products, o = exampleapp", "title =*java*", ctrls);
속성을 수정하십시오
DirContext 및 InitialDirconText의 ModifyAttributes 방법을 사용하여 수행됩니다. 소위 수정 프로세스는 실제로 먼저 수정할 속성 목록을 구성한 다음 위의 방법을 사용하여 제출하는 것입니다. 속성에 여러 값이 포함 된 경우 속성의 수정되지 않은 값을 포함해야합니다. 그렇지 않으면 서버가 더 이상 필요하지 않은 경우 해당 값을 삭제합니다.
public void updateaddress (문자열 dn, 문자열 주소, 문자열 국가, 문자열 폰) {basicattributes mod_attrs = new Basicattributes (); if (address! = null) mod_attrs.put ( "주소", 주소); if (country! = null) mod_attrs.put ( "c", country); if (폰! = null) mod_attrs.put ( "phoneNumber", 전화); if (mod_attrs.size ()! = 0) initial_ctx.modifyattributes (dn, dircontext.replace_attribute, mod_attrs); } ModificationItem을 사용하면 한 번에 여러 가지 다른 수정 작업을 수행 할 수도 있습니다.
modificationItem [] mod_items = new modificationItems [2]; 속성 이메일 = 새로운 BasicAttribute ( "rfc822mailalias", new_email); modificationItem email_mod = new ModificationItem (dircontext.add_attribute, 이메일); 속성 addr = new Basicattribute ( "주소", 주소); modificationItem addr_mod = new ModificationItem (dircontext.replace_attribute, addr); mod_items [0] = email_mod; mod_items [1] = addr_mod; initial_ctx.modifyattributes (dn, mod_items);
컨텍스트를 만듭니다
CreateSubContext 메소드를 사용하여 완료하십시오.
BasicAttributes attrs = new Basicattributes (); atts.put ( "이니셜", 이니셜); attrs.put ( "sn", 사건); atts.put ( "rfc822mailalias", 이메일); if (address! = null) atts.put ( "주소", 주소); if (country! = null) atts.put ( "C", Country); if (phone! = null) atts.put ( "phoneNumber", 전화); initial_ctx.createsubContext (dn, attrs);
컨텍스트를 삭제하십시오
DestroveSubContext 메소드를 사용하여 완료하십시오.
Initial_ctx.destroySubContext (DN);
예
다음은 또 다른 예입니다.
Tomcat의 conf/server.xml에서 구성 :
<context path = "/jndi"> <resource name = "bean/myBeanFactory"auth = "컨테이너"유형 = "com.huawei.jndi.bean.mybean"factory = "org.apache.naming.factory.beancepory"bar = "23"/> </context>
위의 Tomcat에서 구성 요소가 선언되며 코드 에서이 구성 요소를 얻을 수 있습니다.
try {context initcontext = new InitialContext (); 컨텍스트 ENTCTX = (컨텍스트) initContext.Lookup ( "java : comp/env"); mybean bean = (mybean) Envctx.lookup ( "bean/mybeanfactory"); System.out.println (bean.getBar ()); } catch (예외 e) {e.printstacktrace (); }요약 : Tomcat의 JNDI 구성 요소를 구성한 다음 코드에서 장착 구성 요소를 가져옵니다.
각 웹 컨테이너의 JNDI 구현 클래스는 다릅니다. 예를 들어, JBOSS에서 JNDI 프로비블 클래스는 org.jnp.interfaces.namingcontextFactory이며 Tomcat과 다릅니다.
이러한 관점에서 JNDI의 역할은 Spring의 종속성 주입의 역할과 유사합니다. 그러나 JNDI를 통해 응용 프로그램 및 도메인 전체에 걸쳐 구성 요소를 얻을 수 있습니다. 서버 A에서 구성된 구성 요소는 다른 서버의 JNDI를 통해 얻을 수 있습니다.
Spring은 또한 사용하기 편리한 JNDI의 캡슐화를 제공합니다. 다음은 예입니다.
<!-jndi 템플릿-> <bean id = "jnditemplate"> <property name = "환경"> <props> <prop key = "java.naming.factory.initial"> org.jnp.interfaces.namingcontextFactory </prop> <prop key = "java.naming.provider.url"> 10.137.96.212:18199 </prop> <prop key = "java.naming.factory.url.pkgs"> org.jnp.interfaces : org.jboss.naming </props> </property> </bean> </bean> <-연결 공연 | id = "jmsconnectionFactory"> <속성 이름 = "jnditemplate"ref = "jnditemplate" /> <속성 이름 = "jndiname"value = "topicconnectionFactory" /> < /bean
먼저 jnditemplate를 선언하고 대상 주소 및 JNDI 서비스 프로비저닝 클래스를 구성하십시오. 그런 다음 jndiobjectfactorybean을 통해 JNDI 구성 요소를 쉽게 얻고 유형 변환을 수행 할 수 있습니다.