V1. 4 JavaBeans API 의 확장 기능 - xrath.com 에서 번역됨

# 버젼 1.4 에서의 JavaBeansTM Component API 의 API 확장 기능

JavaBeansTM Component API

> 이 문서에서는, Java 2 Platform, Standard Edition 버젼 1.4 로 `java.beans` 패키지에 더해진 변경점에 대해 설명합니다.
> - 장기 지속성을 지원하는 새로운 API
> - 그 외에 추가된 API
> - Introspector 의 변경점
> - 가베지 컬렉션과 커스텀 속성

> ### 장기 지속성을 지원하는 새로운 API

> 장기적인 지속성 (long-term persistence)을 지원하기 위해서, 다음과 같은 클래스가 추가되었습니다.

> 클래스 | 설명
> --- | ---
> `Statement` | 객체의 메소드 호출을 나타내는 객체로, 인수를 수반하는 일이 있다. 예를 나타냅니다. 예를 들면,`a.setFoo(b)`
> `Expression` | 결과를 돌려주는 문장. 예를 나타냅니다. `a.getFoo()`.
> `XMLDecoder` | `XMLEncoder` 를 사용해 작성된 XML 문서를 읽는다
> `Encoder` | 지속성 위양을 사용해, 객체의 그래프를, 그것을 재작성할 때에 사용할 수 있는 일련의 `Statement` 와 `Expression` 에 분할한다
> `XMLEncoder` | XML 인코딩으로 문장과 식을 생성하는 `Encoder`
> `PersistenceDelegate` | 그 객체의 클래스의 public 메소드를 사용해, 다른 객체 상태를 나타내는 객체를 정의하는 추상 클래스
> `DefaultPersistenceDelegate` | Bean 에 대해서 디폴트로 사용하는 지속성 위양

> 장기적인 지속성에 관한 상세 정보에 대한 링크는 JavaBeans Component API 를 참조해 주세요.

> ### 그 외에 추가된 API

> 버젼 1.4 에서는 다음의 클래스도 추가되었습니다.

> 클래스 | 설명
> --- | ---
> `EventHandler` | 사이즈가 작고, 지속성 스킴으로 자동적으로 보존되는 이벤트 청취자의 동적인 생성을 지원한다
> `ExceptionListener` | 예외가 throw 되었다고 통지되지만, 그 후 거기로부터 회복을 하는 청취자를 정의한다. Bean 의 읽고 쓰기중에 객체가 회복 가능한 문제에 직면했을 때에 통지하는 예외 청취자를,`XMLEncoder` 또는 `XMLDecoder` 객체에 등록한다
> `PropertyChangeListenerProxy` | `PropertyChangeListener` 를 구현해, 고유의 프로퍼티을 사용해 그룹에 다른 `PropertyChangeListener` (실제의 이벤트 핸들러)를 제공하는 프록시. 프록시는 프로퍼티의 변경 이벤트를 실제의 이벤트 핸들러에 건네준다
> `VetoableChangeListenerProxy` | `VetoableChangeListener` 를 구현해, 고유의 제약 프로퍼티을 사용해 그룹에 다른 `VetoableChangeListener` (실제의 이벤트 핸들러)를 제공하는 프록시. 프록시는 프로퍼티의 변경 이벤트를 실제의 이벤트 핸들러에 건네준다

> 다음의 클래스에는 추가 메소드가 있습니다.

> - `PropertyChangeSupport` 클래스에는, 등록된 프로퍼티 변경 청취자를 모두 취득하는, 인수가 없는 메소드(`getPropertyChangeListeners` )가 포함되게 되었습니다.
> - 같이`VetoableChangeSupport` 클래스에는, 등록된 거부 가능한 변경 청취자를 모두 취득하는, 인수가 없는 메소드(`getVetoableChangeListeners` )가 포함되게 되었습니다.

> ### Introspector 의 변경점

> `Introspector` 클래스가 재구현되어 퍼포먼스가 개선되었습니다. 새롭게 구현되는 것으로, Introspector 클래스의 동작이 다음과 같이 변경되었습니다.
> - `FeatureDescriptor` 는,`BeanInfo` 가 돌려주어질 때 카피되는 것이 아니라,`BeanInfo` 마다 공유되게 되었습니다. 이 변경에 의해,`getBeanInfo` 메소드의 퍼포먼스가 향상합니다. 또,`FeatureDescriptor` 의 속성/치가 변화하면(자), 그 변화는,`BeanInfo` 가 가베지 컬렉트될 때까지 `getBeanInfo` 의 호출동안에서 지속합니다. (`BeanInfo` 의 가베지 컬렉션에 대해서는,「가베지 컬렉션과 커스텀 속성」을 참조해 주세요. )

> - `getBeanInfo` 메소드는, 요구된 `BeanInfo` 의 카피를 작성하지 않게 되었습니다. 대신에,`BeanInfo` 를 캐쉬에 보존하고 나서 돌려줍니다. 필요하면, 반환된 `BeanInfo` 에 참조를 보존해,`flushFromCaches` 메소드로 인트로스페크타의 캐쉬로부터 Bean 의 클래스를 플래시 해, 이전의 동작을 얻을 수 있습니다.

> - `instantiate` 메소드로, 형제 위젯 또는 bootstrap 클래스 로더를 사용하는 특정의 클래스를 인스턴스화할 수 없는 경우, 현재의 thread의 클래스 로더를 사용하는 클래스를 로드하려고 합니다.

> ### 가베지 컬렉션과 커스텀 속성

> v 1.4 에서는,`BeanInfo` 가 직접 참조되어 있지 않은 경우에 시스템의 메모리가 부족했을 때는,`BeanInfo` 를 가베지 컬렉트할 수 있습니다. 이것은,`BeanInfo` 를 `SoftReference` 에 랩 하는 것으로 `Introspector` 에 구현되고 있습니다.

> 가베지 컬렉트될 가능성이 있기 (위해)때문에,`BeanInfo`내에 커스텀 속성을 포함하는 방법도 바뀌어 옵니다. 특정의 `BeanInfo` 가 가베지 컬렉트되었을 경우, 다음에 `Introspector.getBeanInfo` 를 호출해 이 `BeanInfo` 를 취득할 때, 반환되는 객체에 커스텀 속성이 포함되지 않게 됩니다.

> 이 문제를 피하기 위해서(때문에),`BeanInfo` 내에 커스텀 속성을 포함하는 경우는,`BeanInfo` 를 취득할 때마다, 반드시 이러한 속성을 설정해 `BeanInfo` 를 올바르게 초기화하도록 해 주세요. 다음의 샘플 코드는, Bean 기술자의 커스텀 프로퍼티을 설정해 `BeanInfo` 클래스를 초기화하는 방법을 나타내고 있습니다. 프로퍼티 기술자, 메소드 기술자, 또는 이벤트 세트 기술자의 커스텀 속성에 대해서도, 이 코드와 같게 됩니다.

> >     BeanInfo beanInfo = getBeanInfo(SomeBean.class);
> >     BeanDescriptor beanDescriptor = beanInfo.getBeanDescriptor();

> >     /*
> >      * Before using the BeanInfo, check to see if our custom
> >      * property has been initialized.   (Even if we initialized
> >      * it before, if the BeanInfo has been garbage collected,
> >      * then we need to initialize it again. )  Since our custom
> >      * property's value could be null, we define another property
> >      * to tell us if the custom property is initialized.
> >      */
> >     if (beanDescriptor.getValue("myProperty_init") == null) {
> >         beanDescriptor.setValue("myProperty", someValue);
> >         beanDescriptor.setValue("myProperty_init", Boolean.TRUE);
> >     }

Copyright © 2002 Sun Microsystems, Inc. All Rights Reserved. | Java Software