인프런 커뮤니티 질문&답변

suus님의 프로필 이미지
suus

작성한 질문수

스프링 핵심 원리 - 기본편

@Configuration과 바이트코드 조작의 마법

@Bean 파라미터 있을 경우 빈 생성/등록 순서

작성

·

921

1

 

 @Configuration
  public class AppConfig {
      @Bean
      public MemberService memberService() {
          return new MemberServiceImpl(memberRepository());
      }
      @Bean
      public OrderService orderService() {
          return new OrderServiceImpl(
                  memberRepository(),
                  discountPolicy());
      }
      @Bean
      public MemberRepository memberRepository() {
          return new MemoryMemberRepository();
      }
... }

CGLIB이 AppConfig를 상속한 클래스를 만들어 참조할 빈이 등록되어 있으면 반환, 없으면 생성/등록하도록 조작한다고 이해했습니다.

 

위 방식과 다르게 @Configuration 클래스를 분리하겠습니다.

@Configuration
public class AppConfig {
    @Bean
    public MemberService memberService (MemoryMemberRepository memoryMemberRepository) {
        System.out.println("@@ AppConfig.memberService");
        return new MemberServiceImpl(memoryMemberRepository);
//        return new MemberServiceImpl(getMemoryMemberRepository());
    }
}

@Configuration
public class TestConfig {
    @Bean
    public MemoryMemberRepository memoryMemberRepository() {
        System.out.println("@@ Testconfig.memoryMemberRepository");
        return new MemoryMemberRepository();
    }
}

테스트를 몇 번 해보니 memberService 빈 등록 시 memoryMemberRepository()가 알아서 먼저 호출된다는 걸 확인했습니다.

 

질문입니다.

  1. 파라미터가 있을 경우 memoryMemberRepository 빈(파라미터)이 memberService 빈보다 먼저 생성/등록된다는 게 항상 보장되는 건가요?

  2. 이런 방식에 위험이 있나요?

답변 1

1

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. suus님

스프링은 필요한 정보를 확인해서 빈 생성 순서를 정리합니다. 따라서 순환참조만 아니라면 이렇게 사용하는 것은 정상적인 사용법입니다.

감사합니다.

suus님의 프로필 이미지
suus
질문자

감사합니다

suus님의 프로필 이미지
suus

작성한 질문수

질문하기