Java EE의 인터셉터 소개
이 기사에서는 Java EE의 인터셉터를 소개합니다. 여기에는 인터셉터 메서드, 인터셉터 클래스 및 수명 주기 콜백 인터셉터가 포함됩니다.
Java EE의 인터셉터 소개
Java EE 버전 5에서는 Enterprise JavaBeans(EJBs
)에서만 인터셉터를 사용할 수 있습니다. Java EE 버전 6은 새로운 사양을 도입했지만 더 높은 수준에서 추상화되었기 때문에 더 일반적으로 적용할 수 있었습니다.
Java EE 버전 7은 Enterprise JavaBeans에서 컨테이너 관리 트랜잭션을 허용하는 @Transactional
주석을 도입했습니다. Java EE 런타임에 의해 & 구현된 인터셉터 바인딩으로 정의됩니다.
인터셉터는 대상에서 비즈니스 메소드가 호출될 때 해당 메소드가 호출되는 클래스입니다. 예를 들어 빈을 파괴하거나 생성하는 메서드와 같은 수명 주기 이벤트가 발생합니다.
교차 절단 문제를 구현하기 위해 인터셉터를 사용합니다. 예를 들어 비즈니스 로직의 보안, 감사 및 로깅이 있습니다.
인터셉터를 클래스 인터셉터 또는 메서드 인터셉터로 정의할 수 있으며 선호되는 접근 방식은 메타데이터 주석을 사용하여 인터셉터를 정의하는 것입니다. 응용 프로그램 설명자에서 정의할 수도 있지만 Java EE 서버 간에는 이식할 수 없습니다.
Java의 javax.interceptor
패키지
메타데이터 주석은 javax.interceptor
패키지에 있습니다. 메타데이터 주석의 몇 가지 예는 @AroundTimeout
및 @AroundInvoke
입니다.
javax.interceptor
패키지에는 인터셉터 클래스와 메서드를 정의하는 데 사용하는 모든 인터페이스와 주석이 있으며 인터셉터 클래스를 대상 클래스에 바인딩하는 데도 사용됩니다. 인터셉터의 기능은 Java 인터셉터 사양에 정의되어 있습니다.
인터셉터의 사양은 라이프사이클 콜백 인터셉션과 비즈니스 메서드 인터셉션이라는 두 가지 인터셉션 지점을 정의합니다. 컨텍스트 및 종속성 주입(CDI
)은 이 기능을 개선하고 인터셉터를 Bean에 바인딩하기 위한 시맨틱 및 주석 기반 접근 방식으로 개선합니다.
Java의 인터셉터 메서드
대상 클래스 또는 인터셉터 클래스의 메서드입니다. 대상 클래스의 메서드 호출과 대상 클래스의 생성자 및 수명 주기 이벤트 등에 개입하기 위해 호출됩니다.
대상 클래스의 경우 대상 클래스, 인터셉터 클래스 또는 인터셉터 클래스 또는 대상 클래스의 수퍼 클래스에서 인터셉터 메서드를 선언할 수 있습니다. AroundConstruct
는 인터셉터 클래스 또는 해당 슈퍼클래스에서 정의할 수 있는 유일한 메서드입니다.
AroundInvoke
, AroundTimeout
, PostConstruct
및 PreDestroy
도 인터셉터 메서드입니다. PostConstruct
, AroundConstruct
및 PreDestroy
는 통칭하여 수명 주기 콜백 인터셉터 메서드라고 합니다.
인터셉터 클래스
인터셉터 클래스는 대상 클래스와 다릅니다. 인터셉터 클래스의 메서드는 대상 클래스에 대한 호출에 대한 응답으로 호출되며 대상 클래스는 여러 인터셉터 클래스와 연결할 수 있습니다.
인터셉터 클래스는 인수가 없는 공용 생성자를 포함해야 합니다. 클래스의 경우 메타데이터 주석을 사용하여 인터셉터 클래스 및 메서드를 정의하고 배포 설명자를 사용하여 인터셉터 클래스/메서드를 정의할 수도 있습니다.
인터셉터 클래스는 javax.interceptor.Interceptors
주석에 정의된 순서대로 호출됩니다. 이 순서는 고정되어 있지 않으며 배포 설명자가 이를 재정의할 수 있음을 기억하십시오.
인터셉터 라이프사이클
인터셉터 클래스의 수명 주기는 연결된 대상 클래스와 동일합니다. 대상 클래스를 인스턴스화하면 인터셉터 클래스도 인스턴스화되며 대상 클래스에서 선언하는 모든 인터셉터 클래스에 대해 수행합니다.
@PostConstruct
콜백을 호출하기 전에 모든 인터셉터 및 대상 클래스를 인스턴스화합니다. 또한 @PreDestroy
콜백을 호출하기 전에 인터셉터 대상 클래스의 인스턴스를 파괴하십시오.
Java에서 인터셉터 메서드 및 인터셉터 클래스 사용
인터셉터 메서드를 사용하려면 다음과 같이 메서드 주위에 두기만 하면 됩니다. 우리는 이것을 인터셉트 메소드 인터셉터라고 부릅니다.
@AroundTimeout public void timeoutInterceptorMethod(InvocationContext ctx){...}...
인터셉터 클래스의 경우 인터셉터 주석을 추가합니다. 인터셉터 클래스에 넣습니다.
다음 예를 참조하십시오.
예:
@Stateless
public class OrderBean {
... @Interceptors(OrderInterceptor.class) public void placeOrder(Order order){...}...
}
this를 확인하여 인터셉터를 자세히 살펴볼 수 있습니다.