programing

JDK 다이내믹프록시와 CGLib의 차이점은 무엇입니까?

yoursource 2022. 8. 27. 14:16
반응형

JDK 다이내믹프록시와 CGLib의 차이점은 무엇입니까?

Proxy Design Pattern의 경우 JDK의 Dynamic Proxy와 CGLib 등의 서드파티 동적 코드 생성 API의 차이점은 무엇입니까?

두 가지 접근방식을 모두 사용하는 것과 다른 접근방식을 사용하는 것의 차이점은 무엇입니까?

JDK 다이내믹프록시는 인터페이스에 의한 프록시밖에 할 수 없습니다(따라서 타깃클래스는 인터페이스를 실장해야 합니다.이러한 인터페이스는 프록시 클래스에서도 실장됩니다).

CGLIB(및 javassist)는 서브클래싱을 통해 프록시를 만들 수 있습니다.이 시나리오에서는 프록시가 타깃클래스의 서브클래스가 됩니다.인터페이스는 필요 없습니다.

Dynamic Dynamic 프록시입니다.public class Foo implements iFoo프록시를 할 수 .CGLIB는 프록시입니다.public class Foo

편집:

javassist와 CGLIB는 서브클래싱을 통해 프록시를 사용하기 때문에 이에 의존하는 프레임워크를 사용할 때 최종 메서드를 선언하거나 클래스를 최종화할 수 없습니다.그러면 이러한 라이브러리가 클래스를 하위 분류하고 메서드를 재정의할 수 없게 됩니다.

기능의 차이

  • 는 JDK를 하면서 임의의 수 .Object 방식, 임의의 인터페이스 방식 및Object::hashCode,Object::equals ★★★★★★★★★★★★★★★★★」Object::toString다음으로 에 전송됩니다.또한 표준 라이브러리 인터페이스java.lang.reflect.Proxy구현되어 있습니다.

  • 클래스를 세트를 구현할 수 .또한 선택적으로 방법을 재정의할 수 있습니다. 즉, 모든 비추상 방법을 가로챌 필요는 없습니다.또한 방법을 구현하는 방법에는 여러 가지가 있습니다., ,도 준비되어 있습니다.InvocationHandler다른 패키지에 클래스('da' 'da' 'da' 'da' 'da' 'da' 'da' 'da' 'da' 'da' 'da' 'da' 'da' 'da' 'da' 'da' 'da' 'da' 'da' 'de'와 같은 보다 고도의 .MethodInterceptor는, 「cglib」라고 하는 특수한 수신에 , 시킬 수 있습니다.FixedValuecglib를 위해 다른 가로채기 요약을 작성한 적이 있습니다.

퍼포먼스의 차이

수신 인 JDK 1만 순진하게됩니다.InvocationHandler이를 위해서는 구현에 가상 메서드를 디스패치해야 합니다.이러한 디스패치는 항상 인라인으로 할 수는 없습니다.Cglib를 사용하면 성능을 향상시킬 수 있는 특수한 바이트 코드를 만들 수 있습니다.메서드를 하기 위한 스 here 。

            cglib                   JDK proxy
creation    804.000     (1.899)     973.650     (1.624)
invocation    0.002     (0.000)       0.005     (0.000)

시간은 나노초 단위로 표시됩니다.브레이스에서는 표준 편차가 표시됩니다.벤치마크에 대한 자세한 내용은 Byte Buddy의 튜토리얼에서 확인할 수 있습니다. Byte Buddy는 cglib의 보다 현대적인 대안입니다.또한 cglib는 더 이상 활성화 개발 중이 아닙니다.

동적 프록시:JDK Reflection API를 사용하여 런타임에 인터페이스를 동적으로 구현합니다.

예: Spring은 트랜잭션에 다음과 같이 동적 프록시를 사용합니다.

여기에 이미지 설명 입력

생성된 프록시는 bean 위에 있습니다.콩에 초국가적인 행동을 더합니다.여기서 프록시는 런타임에 JDK Reflection API를 사용하여 동적으로 생성합니다.

애플리케이션이 정지되면 프록시는 파기되고 파일시스템에는 인터페이스와 빈만 남습니다.


위의 예에서는 인터페이스를 사용하고 있습니다.그러나 대부분의 인터페이스 구현에서 최선은 아닙니다.따라서 bean은 인터페이스를 구현하지 않습니다.이 경우 상속을 사용합니다.

여기에 이미지 설명 입력

이러한 프록시를 생성하기 위해 스프링은 CGLib라는 서드파티 라이브러리를 사용합니다.

CGLib(Code Generation Library)는 ASM 위에 구축되어 있습니다.이는 주로 generate proxy extending bean을 사용하여 프록시 메서드에서 bean 동작을 추가합니다.

JDK 다이내믹프록시 및 CGLib의 예

스프링 레퍼런스

Spring 문서부터:

Spring AOP는 JDK 다이내믹 프록시 또는 CGLIB를 사용하여 특정 타깃오브젝트의 프록시를 만듭니다.(선택사항이 있을 경우 JDK 다이내믹 프록시가 권장됩니다).

프록시 대상이 되는 오브젝트가 적어도1개의 인터페이스를 실장하고 있는 경우는, JDK 다이나믹 프록시가 사용됩니다.타겟 타입에 의해 실장된 모든 인터페이스가 프록시 됩니다.타깃 객체가 인터페이스를 구현하지 않으면 CGLIB 프록시가 생성됩니다.

CGLIB 프록시를 강제로 사용하는 경우(예를 들어 인터페이스에 의해 구현된 방식뿐만 아니라 타깃오브젝트에 정의된 모든 메서드를 프록시 하는 경우) 그렇게 할 수 있습니다.그러나 고려해야 할 몇 가지 문제가 있습니다.

최종 방법은 덮어쓸 수 없기 때문에 권장할 수 없습니다.

클래스 패스에 CGLIB 2 바이너리가 필요한 반면 동적 프록시는 JDK에서 사용할 수 있습니다. 스프링은 CGLIB가 필요하고 클래스 패스에 CGLIB 라이브러리 클래스가 없을 때 자동으로 경고합니다.

프록시 개체의 생성자가 두 번 호출됩니다.이는 CGLIB 프록시 모델의 자연스러운 결과이며 각 프록시 오브젝트에 대해 서브클래스가 생성됩니다.각 프록시 인스턴스에 대해 실제 프록시 개체와 조언을 구현하는 하위 클래스의 인스턴스라는 두 개의 개체가 생성됩니다.이 동작은 JDK 프록시를 사용하는 경우에는 나타나지 않습니다.일반적으로 프록시 형식의 컨스트럭터를 두 번 호출하는 것은 문제가 되지 않습니다.이는 일반적으로 할당만 수행되고 실제 로직은 컨스트럭터에 구현되지 않기 때문입니다.

언급URL : https://stackoverflow.com/questions/10664182/what-is-the-difference-between-jdk-dynamic-proxy-and-cglib

반응형