Spring

스프링 컨테이너 ApplicationContext

이무쿤 2023. 8. 2. 22:42
반응형

@Configuration이 붙은 AppConfig에서 Bean을 등록하고 생성자 주입 구현

각 객체가 참조하는 인터페이스에서 @Autowired 없어도 @Configuration을 통해 설정한 Bean이 컨테이너에 등록된 후 

return 형식에 정의 된대로 자동 주입을 해준다.

public class MemberServiceImpl implements MemberService{
    private final MemberRepository memberRepository;

    public MemberServiceImpl(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }

    @Override
    public void join(Member member) {
        memberRepository.save(member);
    }

    @Override
    public Member findMember(Long memberId) {
        return memberRepository.findById(memberId);
    }
}
@Configuration
public class AppConfig {

    @Bean
    public MemberService memberService()
    {
        return new MemberServiceImpl(memberRepository());
    }

    @Bean
    public  MemoryMemberRepository memberRepository() {
        return new MemoryMemberRepository();
    }

    @Bean
    public OrderService orderService()
    {
        return new OrderServiceImpl(memberRepository(),discountPolicy());
    }

    @Bean
    public DiscountPolicy discountPolicy(){
        return new RateDiscountPolicy();
    }
}

Controller에서 MemberService 의존하며, @Autowired로 주입 받는다하면 @Bean으로 등록된 MemberService의 반환 객체인 MeberServiceImpl이 주입될 것이다.

 

만약 객체에서 자동 주입받는 경우 외에 Bean으로 등록된 것을 직접 찾아 쓰는 경우 컨테이너에서 직접 조회가 가능하다.

ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
MemberService memberService = applicationContext.getBean("memberService", MemberService.class);

ApplicationContext는 컨테이너를 의미하며, AnnotationConfig... 객체에 Configuration 파일을 넣어줬을 때 설정된 대로 읽어와서 참조 가능

 

반응형