6.4.3 JDK 및 CGLIB 기반 프록시

이 섹션은 ProxyFactoryBean (프록시 될) 특정 대상 오브젝트에 대해 JDK 기반 프록시 또는 CGLIB 기반 프록시를 작성 하는 방법에 대한 최종 문서입니다 .

ProxyFactoryBeanJDK 또는 CGLIB 기반 프록시를 만드는 것과 관련하여 Spring의 버전 1.2.x와 2.0 사이에서 동작이 변경되었습니다. 이제 ProxyFactoryBean은 TransactionProxyFactoryBean 클래스의 인터페이스와 마찬가지로 자동 감지 인터페이스와 비슷한 의미를 나타냅니다.

프록시 될 대상 객체의 클래스 (이하 간단히 대상 클래스라고 함)가 인터페이스를 구현하지 않으면 CGLIB 기반 프록시가 만들어집니다. JDK 프록시는 인터페이스 기반이기 때문에 가장 쉬운 시나리오이며 JDK 프록시가 가능하지 않은 인터페이스는 없습니다. interceptorNames특성 을 설정하여 대상 bean을 플러그인하고 인터셉터 목록을 지정할 수 있습니다 . CGLIB 기반 프록시는의 proxyTargetClass속성ProxyFactoryBean이 false로 설정된 경우에도 만들어 집니다. (그렇게하는 것은 의미가 없으며 빈 정의에서 제거하는 것이 가장 좋습니다. 왜냐하면 이 개념은 기껏해야 중복되고 최악의 경우 혼란 스럽기 때문입니다.)

대상 클래스가 하나 이상의 (또는 그 이상의) 인터페이스를 구현하는 경우 생성되는 프록시 유형은 ProxyFactoryBean의 구성에 따라 다릅니다.

ProxyFactoryBean의 proxyTargetClass 속성이 true로 설정되면 CGLIB 기반 프록시가 만들어집니다. 이것은 의미 있고 최소한의 놀라움의 원칙에 부합합니다. ProxyFactoryBean의 proxyInterfaces 속성이 하나 이상의 정규화 된 인터페이스 이름으로 설정되어 있어도 proxyTargetClass 속성이 true로 설정되어 있으면 CGLIB 기반 프록시가 적용됩니다.

ProxyFactoryBean의 proxyInterfaces 속성이 하나 이상의 정규화 된 인터페이스 이름으로 설정된 경우 JDK 기반 프록시가 만들어집니다. 작성된 프록시는 proxyInterfaces 특성에 지정된 모든 인터페이스를 구현합니다 . 대상 클래스가 proxyInterfaces속성에 지정된 것보다 훨씬 많은 인터페이스를 구현하는 경우 모두 잘 수행되지만 좋지만 추가 인터페이스는 반환 된 프록시에 의해 구현되지 않습니다.

ProxyFactoryBean의 proxyInterfaces 프로퍼티가 설정되어 있지 않지만, 타겟 클래스가 1 개 (또는 그 이상)의 인터페이스를 구현하고있는 경우, ProxyFactoryBean는 타겟 클래스가 적어도 1 개 이상의 인터페이스 및 JDK베이스의 프록시를 실제로 구현하고있는 것을 자동 검출하고 생성됩니다. 실제로 프록시가되는 인터페이스는 대상 클래스가 구현하는 모든 인터페이스입니다. 사실 이것은 대상 클래스가 구현하는 모든 인터페이스의 목록을 proxyInterfaces속성에 제공하는 것과 같습니다 . 그러나 작업이 현저히 적고 인쇄 오류가 적습니다.

Last updated