728x90
반응형
- 자기 자신을 생성하면서 주입해야해서 실패한다.
- 수정자 주입이나 지연 조회 사용
- 스프링 빈 지연해서 조회 → ObjectProvider(Provider), ApplicationContext 사용
@Slf4j
@Component
public class CallServiceV2 {
private final ApplicationContext applicationContext;
public CallServiceV2(ApplicationContext applicationContext) {
this.applicationContext = applicationContext;
}
public void external() {
log.info("call external");
CallServiceV2 callServiceV2 = applicationContext.getBean(CallServiceV2.class);
callServiceV2.internal();
}
public void internal() {
log.info("call internal");
}
}
- CallServiceV2
@Slf4j
@Component
public class CallServiceV2 {
private final ObjectProvider<CallServiceV2> callServiceObjectProvider;
public CallServiceV2(ObjectProvider<CallServiceV2> callServiceObjectProvider) {
this.callServiceObjectProvider = callServiceObjectProvider;
}
public void external() {
log.info("call external");
CallServiceV2 callServiceV2 = callServiceObjectProvider.getObject();
callServiceV2.internal();
}
public void internal() {
log.info("call internal");
}
}
- test
@Import(CallLogAspect.class)
@SpringBootTest
class CallServiceV2Test {
@Autowired
CallServiceV2 callServiceV2;
@Test
void external() {
callServiceV2.external();
}
}

- ApplicationContext는 너무 많은 기능을 제공한다.
- ObjectProvider는 객체를 스프링 컨테이너에서 조회하는 것을 스프링 빈 생성 시접이 아니라 실제 객체를 사용하는 시점으로 지연할 수 있다.
- callServiceProvider.getObject()를 호출하는 시점에 스프링 컨테이너에서 빈을 조회한다.
- 자기 자신을 주입받는 것이 아니기 때문에 순환 사이클 발생 안함
728x90
반응형
댓글