Tech/Spring

스프링 AOP - 프록시와 내부 호출 대안(2) 지연 조회

봄의 개발자 2023. 11. 10.

목차

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();
    }
}

 

스프링 AOP - 프록시와 내부 호출 대안(2) 지연 조회 - undefined - 모든 영역

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

댓글