Interface StateFactory

Interface StateFactory

public interface StateFactory

바인딩할 객체의 상태를 얻기 위한 팩토리를 나타내는 인터페이스예요. JNDI 프레임워크는 객체 팩토리를 통해 객체 구현을 동적으로 로드할 수 있게 해 줘요. 예를 들어 네임스페이스에 바인딩된 프린터를 조회할 때, 프린트 서비스가 프린터 이름을 Reference에 바인딩한다면 그 프린터 Reference로 프린터 객체를 만들 수 있어요. 그래서 lookup 호출자는 lookup 후에 프린터 객체를 직접 조작할 수 있어요. ObjectFactory는 특정 타입의 객체를 만드는 책임을 가져요. 위 예에서는 Printer 객체를 만드는 PrinterObjectFactory가 있을 수 있어요. 그 반대 과정에서, 객체가 네임스페이스에 바인딩될 때 JNDI는 상태 팩토리(state factory)를 제공해요. 프린터 예를 계속하면, 프린터 객체가 갱신되어 다시 바인딩된다고 가정해 봐요.

ctx.rebind("inky", printer);

ctx의 서비스 공급자는 상태 팩토리를 사용해 네임스페이스에 바인딩하기 위한 printer의 상태를 얻어요. Printer 타입 객체용 상태 팩토리는 네이밍 시스템에 저장하기 더 간결한 객체를 반환할 수 있어요. 상태 팩토리는 StateFactory 인터페이스를 구현해야 해요. 또한 팩토리 클래스는 public이어야 하고 인자를 받지 않는 public 생성자를 가져야 해요. 팩토리가 이름이 있는 모듈(named module) 안에 있다면 java.naming 모듈에 그 모듈이 export하는 패키지에 있어야 해요. 상태 팩토리의 getStateToBind() 메서드는 아마도 다른 매개변수를 사용해 여러 번 호출될 수 있어요. 구현은 스레드 안전해요. StateFactoryContext 인터페이스만 구현하는 서비스 공급자와 함께 사용하도록 만들어졌어요. DirStateFactoryDirContext 인터페이스를 구현하는 서비스 공급자와 함께 사용하도록 만들어졌어요.

getStateToBind

Object getStateToBind(Object obj,
 Name name,
 Context nameCtx,
 Hashtable<?,?> environment)
               throws NamingException

바인딩할 객체의 상태를 가져와요. NamingManager.getStateToBind()는 상태 팩토리를 차례로 로드하고, 하나가 null이 아닌 답을 만들어낼 때까지 이 메서드를 호출해요. DirectoryManager.getStateToBind()도 상태 팩토리를 차례로 로드해요. 팩토리가 DirStateFactory를 구현하면 DirectoryManagerDirStateFactory.getStateToBind()를 호출하고, 그렇지 않으면 StateFactory.getStateToBind()를 호출해요. 팩토리가 예외를 던지면 그 예외는 NamingManager.getStateToBind()DirectoryManager.getStateToBind()의 호출자에게 전달돼요. null이 아닌 답을 만들 수 있는 다른 팩토리를 찾는 작업은 중단돼요. 팩토리는 자신이 유일한 의도된 팩토리이고 다른 팩토리를 시도해서는 안 된다고 확신할 때만 예외를 던져야 해요. 이 팩토리가 제공된 인자로 객체를 만들 수 없으면 null을 반환해야 해요. name과 nameCtx 매개변수는 선택적으로 만들어지는 객체의 이름을 지정하는 데 사용될 수 있어요. 자세한 내용은 ObjectFactory.getObjectInstance()의 "이름과 컨텍스트 매개변수" 설명을 참조하세요. 팩토리가 nameCtx를 사용하면 동시 접근에 대해 사용을 동기화해야 해요. 컨텍스트 구현이 스레드 안전하다는 보장이 없기 때문이에요. name과 environment 매개변수는 호출자가 소유해요. 구현은 이 객체들을 수정하거나 참조를 유지하지 않아요. 클론이나 복사본에 대한 참조를 유지할 수는 있어요.

  • Parameters: obj - 상태를 가져올, null이 아닌 객체
  • Returns: 바인딩할 객체의 상태; 팩토리가 어떤 변경도 반환하지 않으면 null
  • Throws: NamingException - 이 팩토리가 객체의 상태를 얻으려는 동안 예외를 만났고, 시도할 다른 팩토리가 없을 때
  • See Also: NamingManager.getStateToBind(java.lang.Object, javax.naming.Name, javax.naming.Context, java.util.Hashtable), DirectoryManager.getStateToBind(java.lang.Object, javax.naming.Name, javax.naming.Context, java.util.Hashtable, javax.naming.directory.Attributes)