다음은 CGLib의 기본 작성 방법입니다(net.sf.cglib.proxy.* 패키지의 클래스를 사용하여 구현됨)
으아아아인쇄된 결과는 다음과 같습니다.
before fun1
before fun2
fun2()가 foo.fun1()을 통해 호출되더라도 fun()2는 여전히 프록시될 수 있음을 알 수 있습니다.
그러나 Spring AOP의 기본 작성 방법을 사용하는 경우:
으아아아출력 결과는 다음과 같습니다.
before fun1
fun2
fun2 메소드가 프록시되지 않았음을 알 수 있습니다.
왜 이런 차이가 나는 걸까요?
Spring의 AOP는 내부 메소드 호출을 가로챌 수 없습니다. Spring은 프록시 이후에 실제 객체의 Bean과 ProxyBean을 보고합니다. ProxyBean은 다음과 같습니다.
전proxyBean은 다음과 동일합니다.
이런 식으로 fun2는 실제 bean에 의해 실제로 호출되므로(invoke는 실행하려는 메소드를 실행하기 위해 실제 객체를 사용함) 사전 효과가 없습니다.
실제로 cglib를 사용하면 프로세스 전반에 걸쳐 프록시 Bean을 사용하게 됩니다