[Spring]Ioc 컨테이너와 스프링 빈

지수·2022년 5월 10일
0

IoC 컨테이너

전 게시물에서 만들었던 AppConfig 같이 객체를 생성하고 관리하며 의존관계를 주입해주는 것을 IoC 컨테이너(Inversion of Control)라고 한다. 그 중에서도 스프링 프레임워크에서는 스프링 컨테이너 라고 한다.

스프링 컨테이너 생성과정

1.스프링 컨테이너 생성

@Configuration // 구성정보를 지정하는 어노테이션
public class AppConfig {

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

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

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

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

2.스프링 빈 등록

빈 이름 = 메서드이름
직접 등록할 경우 : @Bean(name="memberService2")

  • 위와 같이 구성 정보를 뜻하는 어노테이션과 각 메소드에 bean 어노테이션을 등록하면 스프링 빈이 등록이 된다.
  • 나는 지금 스프링 프레임워크 말고 순수 자바만으로 사용하는 것이기 때문에 컨테이너를 수동으로 생성해준다.
 ApplicationContext applicationContext= 
 new AnnotationConfigApplicationContext(AppConfig.class);
 MemberService memberService = 
 applicationContext.getBean("memberService", MemberService.class);
  • 여기서 생성되는 AnnotationConfigApplicationContext는 어노테이션 기반으로 관리가 들어가는 스프링 컨테이너다.
  • 스프링 컨테이너에 구성정보 클래스를 넣어주어 생성이 되면 메소드이름을 통해 빈에 접근하고 등록된 빈은 구현체를 리턴한다.

3.스프링 빈 의존관계 설정 - 준비

4.스프링 빈 의존관계 설정 - 완료

등록된 빈 조회

  • 등록된 빈 조회는 의존관계 주입 때 빈 조회할 때 방법과 같은 방법

1. 모든 빈 출력

String[] beanDefinitionNames= ac.getBeanDefinitionNames();
        for (String beanDefinitionName : beanDefinitionNames) {
            Object bean = ac.getBean(beanDefinitionName);

ac.getBeanDefinitionNames() 스프링에 등록된 모든 빈 이름 조회
ac.getBean() 빈 이름으로 빈 객체 조회

**스프링 빈 조회의 기본 방법**

ac.getBean(빈이름,타입)
ac.getBean(타입)
조회 대상 없을 경우 : NoSuchBeanDefinitionException

2. 타입으로만 조회

  • 타입으로만 조회 시 같은 타입의 스프링 빈이 둘 이상이면 오류가 발생
MemberService memberService = ac.getBean(MemberService.class);

3. 이름 , 타입으로 조회

MemberService memberService = ac.getBean("memberService",
MemberServiceImpl.class);
assertThrows(NoSuchBeanDefinitionException.class,
() -> ac.getBean("xxxxx",MemberServiceImpl.class));

4. 동일한 타입이 둘 이상

ac.getBeansOfType() : 모든 빈을 조회

Map<String, MemberRepository> beansOfType = ac.getBeansOfType(MemberRepository.class);
for (String key : beansOfType.keySet()) {
            System.out.println("key = " + key+"value"+beansOfType.get(key));
        }

스프링 빈 조회 - 상속관계

  • 부모타입으로 조회하면 자식 타입도 함께 조회된다.
  • 부모타입으로 조회 시 자식이 둘 이상 있으면, 빈 이름을 지정해서 조회하면 된다.
    -최상위 타입인 object class 타입으로 조회하면 모든 빈을 조회할 수 있다.
profile
코딩하는 대학생

0개의 댓글