6.4 5 프록시 클래스

하나 이상의 인터페이스가 아닌 클래스를 프록시해야하는 경우에는 어떻게해야합니까?

이전 예제에서 Person인터페이스 가 없다고 상상해보십시오 . 우리는 Person비즈니스 인터페이스를 구현하지 않은 클래스에 advice 할 필요가 있었습니다. 이 경우 동적 프록시가 아닌 CGLIB 프록시를 사용하도록 Spring을 설정할 수 있습니다. 이렇게하려면 proxyTargetClass앞에 ProxyFactoryBean표시된 속성을로 true로 설정하십시오. 클래스가 아닌 인터페이스로 프로그램하는 것이 가장 좋지만, 인터페이스를 구현하지 않는 클래스에 조언하는 기능은 레거시 코드로 작업 할 때 유용 할 수 있습니다. (일반적으로 Spring은 규범이 아니다. 좋은 실행을 적용하기 쉽지만 특정 접근법을 강요하는 것을 피한다.)

원할 경우, 인터페이스를 가지고 있더라도 어떤 경우에도 CGLIB를 강제로 사용할 수 있습니다.

CGLIB 프록싱은 런타임에 대상 클래스의 하위 클래스를 생성하여 작동합니다. Spring은이 생성 된 서브 클래스를 설정하여 메소드 호출을 원래 대상으로 위임합니다. 이 하위 클래스는 Decorator 패턴을 구현하는 데 사용되며 advice에 짜여져 있습니다.

Decorator 패턴

객체의 결합으로 기능을 동적으로 유연하게 확장할 수 있게 해주는 패턴. 기본 기능에 추가할 기능 종류가 많은 경우에 추가 기능을 Decorator 클래스로 정의하고 필요한 Decorator 객체를 조합해서 추가 기능의 조합을 설계하는 방식.

(예를 들어서, 기본 도로 표시 기능에 차선표시, 교통량 표시, 교차로 표시 등의 추가 기능이 있을 때 조합한다.)

CGLIB 프록시는 일반적으로 사용자에게 투명해야합니다. 그러나 고려해야 할 몇 가지 문제가 있습니다.

  • Final 메소드를 재정의 할 수 없으므로 메소드를 권고 할 수 없습니다.

  • 클래스 경로에 CGLIB를 추가 할 필요가 없습니다. Spring 3.2부터는 CGLIB가 다시 패키징되어 Spring-core JAR에 포함되었다. 즉, CGLIB 기반 AOP는 JDK 동적 프록시처럼 "즉시"작동합니다.

CGLIB 프록시와 동적 프록시 간의 성능 차이는 거의 없습니다. 이 경우 성과가 결정적으로 고려되어서는 안됩니다.

Last updated