spring core aop : proxy - type casting problem

This commit is contained in:
haerong22
2021-11-29 01:19:07 +09:00
parent 5811885526
commit 79edb155af
3 changed files with 92 additions and 0 deletions

View File

@@ -0,0 +1,42 @@
package com.example.aop.proxyvs;
import com.example.aop.member.MemberService;
import com.example.aop.member.MemberServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.springframework.aop.framework.ProxyFactory;
import static org.junit.jupiter.api.Assertions.*;
@Slf4j
public class ProxyCastingTest {
@Test
void jdkProxy() {
MemberServiceImpl target = new MemberServiceImpl();
ProxyFactory proxyFactory = new ProxyFactory(target);
proxyFactory.setProxyTargetClass(false); // JDK 동적 프록시 (인터페이스 기반)
// 프록시를 인터페이스로 캐스팅 가능
MemberService memberServiceProxy = (MemberService) proxyFactory.getProxy();
// JDK 동적 프록시를 구현 클래스로 캐스팅 불가능, ClassCastException 예외 발생
assertThrows(ClassCastException.class, () -> {
MemberServiceImpl casingMemberService = (MemberServiceImpl) memberServiceProxy;
});
}
@Test
void cglibProxy() {
MemberServiceImpl target = new MemberServiceImpl();
ProxyFactory proxyFactory = new ProxyFactory(target);
proxyFactory.setProxyTargetClass(true); // CGLIB 프록시 (구현체 기반)
// 프록시를 인터페이스로 캐스팅 가능
MemberService memberServiceProxy = (MemberService) proxyFactory.getProxy();
// CGLIB 프록시를 구현 클래스로 캐스팅 가능
MemberServiceImpl casingMemberService = (MemberServiceImpl) memberServiceProxy;
}
}

View File

@@ -0,0 +1,34 @@
package com.example.aop.proxyvs;
import com.example.aop.member.MemberService;
import com.example.aop.member.MemberServiceImpl;
import com.example.aop.proxyvs.code.ProxyDIAspect;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.annotation.Import;
@Slf4j
//@SpringBootTest(properties = {"spring.aop.proxy-target-class=false"}) // JDK 동적 프록시
//@SpringBootTest(properties = {"spring.aop.proxy-target-class=true"}) // CGLIB 프록시
@SpringBootTest
@Import(ProxyDIAspect.class)
public class ProxyDITest {
@Autowired
MemberService memberService;
/**
* JDK 동적 프록시 생성 시 타입 캐스트 불가능 (인터페이스 기반이므로 구체클래스를 알 수 없다.)
*/
@Autowired
MemberServiceImpl memberServiceImpl;
@Test
void go() {
log.info("memberService class={}", memberService.getClass());
log.info("memberServiceImpl class={}", memberServiceImpl.getClass());
memberService.hello("hello");
}
}

View File

@@ -0,0 +1,16 @@
package com.example.aop.proxyvs.code;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
@Slf4j
@Aspect
public class ProxyDIAspect {
@Before("execution(* com.example.aop..*.*(..))")
public void doTrace(JoinPoint joinPoint) {
log.info("[proxyDIAdvice] {}", joinPoint.getSignature());
}
}