7.12. 데코레이터

데코레이터는 특정 Java 인터페이스에서 호출을 가로채며 해당 인터페이스에 연결된 모든 의미 체계를 인식합니다. 데코레이터는 일부 유형의 비즈니스 문제를 모델링하는 데 유용하지만 인터셉터는 일반적으로 없습니다. 데코레이터는 빈 또는 추상 클래스로, 패키징하는 유형을 구현하고 @Decorator 로 주석이 추가됩니다. Jakarta Contexts 및 Dependency Injection 애플리케이션에서 데코레이터를 호출하려면 bean.xml 파일에 지정해야 합니다.

예제: bean.xml을 통해 액셀러레이터 호출

<beans
   xmlns="http://xmlns.jcp.org/xml/ns/javaee"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="
      http://xmlns.jcp.org/xml/ns/javaee
      http://xmlns.jcp.org/xml/ns/javaee/beans_2_0.xsd">
   <decorators>
         <class>org.mycompany.myapp.LargeTransactionDecorator</class>
   </decorators>
</beans>

이 선언은 다음 두 가지 주요 목적을 제공합니다.

  • 이를 통해 시스템에서 데코레이터의 순서를 지정하여 결정적인 동작을 보장할 수 있습니다.
  • 배포 시 데코레이터 클래스를 활성화하거나 비활성화할 수 있습니다.

데코레이터에 정확히 하나의 @Delegate 주입 지점이 있어야 하므로 이 오브젝트에 대한 참조를 얻을 수 있습니다.

예제: 데코레이터 클래스

@Decorator
public abstract class LargeTransactionDecorator implements Account {

   @Inject @Delegate @Any Account account;
   @PersistenceContext EntityManager em;

   public void withdraw(BigDecimal amount) {
      ...
   }

   public void deposit(BigDecimal amount);
      ...
   }
}

@Priority 주석을 사용하여 전체 애플리케이션에 대해 데코레이터를 활성화할 수 있습니다.

@Priority 를 사용하여 활성화한 데코레이터는 beans.xml 파일을 사용하여 활성화되기 전에 데코레이터를 호출합니다. 더 낮은 우선 순위 값을 먼저라고 합니다.

참고

@Priority 에 의해 데코레이터를 활성화하고 beans.xml 에서 동시에 호출하면 포팅할 수 없는 동작이 발생합니다. 따라서 다양한 컨텍스트 및 종속성 주입 구현에서 일관된 동작을 유지하려면 활성화의 이러한 조합을 피해야 합니다.