대상 클래스에 기본 생성자가 없을 때
74
24 asked
제목과 같은 상황에서 어떻게 될지 궁금해서 테스트를 진행해봤습니다.
@Component
public class Test {
public Test(MemberService memberService) {
}
}
// =================================================
@Aspect
public class TestAspect {
@Before("execution(* hello.aop..*.*(..))")
public void doTrace(JoinPoint joinPoint) {
}
}
// =================================================
@Slf4j
@SpringBootTest(properties = {"spring.aop.proxy-target-class=true"})
@Import(TestAspect.class)
public class ProxyTest {
@Autowired Test test;
@Test
void test() {
log.info("class={}", test.getClass());
}
}필드 test에 class=class hello.aop.test.Test와 같이 원본 객체가 주입된 것을 확인할 수 있습니다.
이러한 순서로 흘러가는 게 맞을까요?
처음에 생성된 원본 Test 빈이 AutoProxyCreator에 전달된다
포인트컷에 맞는 조건이므로 CGLIB로 프록시 생성 시도
CGLIB 내부에서 원본의 기본 생성자를 (호출할 수 없어서?) (찾을 수 없어서?) -> return 원본
결국 반환된 원본이 빈으로 등록
추가) 다음 강의를 듣고왔는데 이해가 안되는 부분이 있습니다.
스프링 4.0부터 기본 생성자가 필수인 문제가 해결되었다고 하는데 왜 위의 테스트에서는 프록시 객체가 아닌 원본 객체가 주입되었나요?
Answer 1
0
안녕하세요, 인프런 AI 인턴입니다.
조태준님, 질문에 대해 설명드리겠습니다.
스프링에서 빈이 등록될 때, 다음과 같은 순서로 프록시가 생성됩니다:
ProxyTargetClass 설정:
@SpringBootTest(properties = {"spring.aop.proxy-target-class=true"})설정으로 인해 CGLIB 프록시가 사용됩니다.원본 객체 주입: Spring은 대상 클래스의 빈을 생성하기 위해 먼저 원본 객체를 생성합니다. 이때 생성자 주입을 통해 의존성을 해결합니다.
AutoProxyCreator: 원본 빈이
AutoProxyCreator에게 전달됩니다.프록시 생성 시도: CGLIB는 프록시를 생성하려고 시도하는데, 이때 기본 생성자가 없는 경우 프록시 생성에 제약이 있을 수 있습니다.
기본 생성자 문제: 스프링 4.0 이후로는 기본 생성자가 없어도 프록시 생성이 가능하도록 개선되었지만, 특정한 상황에서는 여전히 문제를 일으킬 수 있습니다. 예를 들어, CGLIB가 원본 객체의 새로운 인스턴스를 생성하려 할 때 원본 클래스에 상속할 기본 생성자가 필요할 수 있습니다.
결과적으로, 이러한 이유로 프록시가 아닌 원본 객체가 주입되는 상황이 발생할 수 있습니다. 프록시가 생성되지 않은 경우에 대한 것은 여러 요인에 의한 것이며, CGLIB의 제한일 수 있습니다.
위의 설명과 연관된 이미지와 정보를 원하실 경우 아래 URL을 참고하시기 바랍니다:
스프링 부트 문서
추가적으로, 정확한 해결을 위해서는 구체적인 환경 설정과 코드를 확인하는 과정이 필요할 수 있습니다. 도움이 되셨기를 바랍니다.
어드바이스 순서 디폴트 기준이 궁금합니다.
0
51
1
AspectV1 예제를 @Configuration 수동 등록으로도 가능한가요?
0
78
2
구체 클래스를 상속받아 확장한 형태도 클래스패턴/데코레이터 패턴이라고 칭하나요?
0
52
1
TraceTemplate 을 미리 빈으로 등록해서 사용할때 이렇게 설정하는게 맞는건가요?
0
53
1
Decorator 에서 추상메서드로 뺄때 질문 있습니다.
0
55
1
스프링 부트 버전 4.0 aop 의존성 명칭 변경
1
346
2
final 키워드 사용 관련 질문
0
75
1
안녕하세요
0
64
1
ThradLocal 실무 사례
0
97
2
실무에서의 동시성 문제
0
62
1
로그 등 부가 기능에 대한 테스트코드
0
50
1
ProceedingJoinPoint와 MethodInvocation에 대하여
0
67
1
실무 멀티스레딩에 대한 궁금증
0
69
1
안녕하세요 질문있습니다
0
43
1
AspectV3 aop 실행 순서 문의 드립니다
0
37
1
MDC vs AOP 중에 고민중입니다.
0
74
1
순환참조
0
158
2
this를 단독으로 사용할때랑 파라미터 바인딩 할때 차이
0
77
1
빈 후처리에 등록 질문 있습니다.
0
75
1
AppConfig 설정하는 설명중에 이해가 안되는게 있습니다.
0
88
1
ThreadLocal을 지역변수로 선언하면 remove가 필요할까요?
0
117
2
@Aspect 어노테이션으로 생성된 Advisor의 Bean 저장 여부
0
67
1
ThreadLocal 사용시 부작용이 있을수 있을까요? (ThreadLocal.remove()를 잘한다고 해도..)
0
73
2
빈으로 주입하지 않고 new로 객체 생성해도 되는데, 왜 ThreadLocal을 사용하나요?
0
72
1

