Interface ObjectFactory
Interface ObjectFactory
public interface ObjectFactory
객체를 만드는 팩토리를 나타내는 인터페이스예요. JNDI 프레임워크는 객체 팩토리를 통해 객체 구현을 동적으로 로드할 수 있게 해 줘요. 예를 들어 네임스페이스에 바인딩된 프린터를 조회할 때, 프린트 서비스가 프린터 이름을 Reference에 바인딩한다면 그 프린터 Reference로 프린터 객체를 만들 수 있어요. 그래서 lookup 호출자는 lookup 후에 프린터 객체를 직접 조작할 수 있어요. ObjectFactory는 특정 타입의 객체를 만드는 책임을 가져요. 위 예에서는 Printer 객체를 만드는 PrinterObjectFactory가 있을 수 있어요. 객체 팩토리는 ObjectFactory 인터페이스를 구현해야 해요. 또한 팩토리 클래스는 public이어야 하고 인자를 받지 않는 public 생성자를 가져야 해요. 팩토리가 이름이 있는 모듈 안에 있다면 java.naming 모듈에 그 모듈이 export하는 패키지에 있어야 해요. 객체 팩토리의 getObjectInstance() 메서드는 아마도 다른 매개변수를 사용해 여러 번 호출될 수 있어요. 구현은 스레드 안전해요. 이 클래스 문서의 URL 언급은 RFC 1738과 그 관련 RFC에 정의된 URL 문자열을 가리켜요. 거기에 설명된 구문을 따르는 어떤 문자열도 해당하며, java.net.URL 클래스나 웹 브라우저에서 항상 대응하는 지원이 있을 필요는 없어요.
getObjectInstance
Object getObjectInstance(Object obj,
Name name,
Context nameCtx,
Hashtable<?,?> environment)
throws Exception
지정된 위치/참조 정보를 사용해 객체를 만들어요. 이 객체의 특수 요구 사항은 environment를 사용해 제공돼요. 그런 환경 속성의 예로는 사용자 신원 정보가 있어요. NamingManager.getObjectInstance()는 객체 팩토리를 차례로 로드하고, 하나가 null이 아닌 답을 만들어낼 때까지 이 메서드를 호출해요. 객체 팩토리가 예외를 던지면 그 예외는 NamingManager.getObjectInstance()의 호출자에게 전달돼요(그리고 null이 아닌 답을 만들 수 있는 다른 팩토리를 찾는 작업은 하지 않아요). 객체 팩토리는 자신이 유일한 의도된 팩토리이고 다른 객체 팩토리를 시도해서는 안 된다고 확신할 때만 예외를 던져야 해요. 이 팩토리가 제공된 인자로 객체를 만들 수 없으면 null을 반환해야 해요. URL 컨텍스트 팩토리는 URL 또는 위치가 URL로 지정된 객체를 해석하기 위한 컨텍스트를 만드는 특수 ObjectFactory예요. URL 컨텍스트 팩토리의 getObjectInstance() 메서드는 다음 규칙을 따를 거예요.
- obj가 null이면, 이 팩토리와 연관된 스킴(scheme)의 URL을 해석하기 위한 컨텍스트를 만들어요. 결과 컨텍스트는 특정 URL에 묶이지 않아요: 이 팩토리의 스킴 ID를 가진 임의의 URL을 처리할 수 있어요. 예를 들어 LDAP URL 컨텍스트 팩토리에서 obj를 null로 설정해
getObjectInstance()를 호출하면"ldap://ldap.wiz.com/o=wiz,c=us"나"ldap://ldap.umich.edu/o=umich,c=us"같은 LDAP URL을 해석할 수 있는 컨텍스트를 반환할 거예요. - obj가 URL 문자열이면, 그 URL로 식별되는 객체(보통 컨텍스트)를 만들어요. 예를 들어 이 팩토리가 LDAP URL 컨텍스트 팩토리라고 가정해 봐요. obj가
"ldap://ldap.wiz.com/o=wiz,c=us"이면getObjectInstance()는 LDAP 서버 ldap.wiz.com의 distinguished name"o=wiz, c=us"로 이름이 붙은 컨텍스트를 반환할 거예요. 그런 다음 이 컨텍스트를 사용해 그 컨텍스트에 상대적인 LDAP 이름(예:"cn=George")을 해석할 수 있어요. - obj가 URL 문자열 배열이면, URL들이 가리키는 컨텍스트 측면에서 동등하다고 가정해요. URL이 동등한지(또는 동등해야 하는지) 검증하는 것은 컨텍스트 팩토리에게 달려 있어요. 배열에서 URL의 순서는 중요하지 않아요.
getObjectInstance()가 반환하는 객체는 단일 URL 경우와 같아요. URL들이 이름 붙이는 객체이에요. - obj가 다른 어떤 타입이면,
getObjectInstance()의 동작은 컨텍스트 팩토리 구현이 결정해요.
name과 environment 매개변수는 호출자가 소유해요. 구현은 이 객체들을 수정하거나 참조를 유지하지 않아요. 클론이나 복사본에 대한 참조를 유지할 수는 있어요.
이름과 컨텍스트 매개변수. name과 nameCtx 매개변수는 선택적으로 만들어지는 객체의 이름을 지정하는 데 사용될 수 있어요. name은 컨텍스트 nameCtx에 상대적인 객체의 이름이에요. 객체가 이름 붙을 수 있는 컨텍스트가 여러 개 있을 수 있는데 — 이는 흔한 경우예요 — 호출자가 하나를 선택해야 해요. 좋은 경험 법칙은 가용한 "가장 깊은(deepest)" 컨텍스트를 선택하는 것이에요. nameCtx가 null이면 name은 기본 초기 컨텍스트에 상대적이에요. 이름을 지정하지 않으면 name 매개변수는 null이어야 해요. 팩토리가 nameCtx를 사용하면 동시 접근에 대해 사용을 동기화해야 해요. 컨텍스트 구현이 스레드 안전하다는 보장이 없기 때문이에요.
- Parameters: obj - 객체를 만드는 데 사용할 수 있는 위치/참조 정보를 담은, null일 수 있는 객체
- Returns: 만들어진 객체; 객체를 만들 수 없으면 null
- Throws: Exception - 이 객체 팩토리가 객체를 만들려는 동안 예외를 만났고, 시도할 다른 객체 팩토리가 없을 때
- See Also: NamingManager.getObjectInstance(java.lang.Object, javax.naming.Name, javax.naming.Context, java.util.Hashtable, ?>), NamingManager.getURLContext(java.lang.String, java.util.Hashtable, ?>)