Languege/Java & Spring / / 2022. 3. 10. 09:45

[김영한 스프링] 스프링 컨테이너와 빈

 

스프링 컨테이너 생성 과정

1.스프링 컨테이너 생성

ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);

ApplicationContext는 스프링 컨테이너라 합니다. 이것은 인터페이스이기 때문에 xml을 기반으로 만들 수도 있고 애노테이션 기반의 자바 설정 클래스로 만들 수 있습니다.

AppConfig라는 java 파일을 기반으로 애노테이션 기반의 자바 설정 클래스로 컨테이너를 만들었습니다.

 

스프링 컨테이너를 부를 때 BeanFactory, ApplicationContext로 구분해서 이야기합니다.

 

2.스프링 빈 등록

이후 new AnnotationConfigApplicationContext(AppConfig.class);에서 AppConfig를 살펴보면 아래 그림과 같습니다. 스프링 컨테이너는 파라미터로 넘어온 설정 클래스 정보를 사용해 스프링 빈을 등록합니다.

Bean 이름으로 메소드 명이 등록되고, Bean 객체로는 return된 값이 등록됩니다. Bean의 이름은 임의로 부여할 수 있습니다. @Bean(name=”memberService2”) Bean 이름이 중복되면 다른 Bean이 무시되거나, 덮어버리거나 할 수 있어서 주의해야 합니다.

 

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

이후 위 이미지에 따라 설정 정보를 참고해서 의존관계를 주입(DI) 합니다. 스프링은 Bean을 생성하고 의존관계를 주입하는 단계가 나뉘어 있습니다. 하지만 자바 코드로 스프링 Bean을 등록하면 생성하면서 의존관계 주입도 한번에 처리합니다.

new MemberServiceImpl(getMemberRepository());

컨테이너에 등록된 Bean 조회

스프링 컨테이너에 등록된 Bean은 다양한 방법으로 조회가 가능합니다. 모든 Bean을 조회할 수도 있고, Application Bean만을 따로 출력이 가능합니다. 그 외에 구체 타입, 빈 이름으로, 타입으로만 조회 등등이 가능합니다.

간단히 설명하자면

1.AnnotationConfigApplicationContext를 생성

AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);

2.해당 객체를 이용해서 조회

DiscountPolicy rateDiscountPolicy = ac.getBean("rateDiscountPolicy", DiscountPolicy.class);

 

위와 같은 방식으로 조회가 가능하며 일반화 시키자면 ac.getBean(“빈 이름”,타입);으로 Bean 이름과 조회할 타입의 class를 넘겨주면 getBean으로 조회할 수 있습니다. 그 외에도 이름을 입력하지 않고 타입으로만 조회할 수 있으며, 부모 타입으로 조회하여 자식 타입까지 한번에 조회도 가능합니다. Object 타입으로 조회하면 스프링 컨테이너에서 사용하는 모든 Bean을 조회할 수 있습니다.