스프링 컨테이너(Container)와 스프링 빈(Bean)

2022. 6. 16. 01:43TIL💡/Java

  • ApplicationContext를 스프링 컨테이너라 한다.
  • 기존에는 개발자가 AppConfig를 사용해서 직접 객체를 생성하고 DI를 했지만, 이제부터는 스프링 컨테이너를 통해서 사용한다.
  • 스프링 컨테이너는 @Configuration이 붙은 AppConfig를 설정(구성)정보로 사용한다. 여기서 Bean이라 적힌 메서드를 모두 호출해서 반환된 객체를 스프링 컨테이너에 등록한다. 이렇게 스프링 컨테이너에 등록된 객체를 스프링 빈이라 한다.
  • 스프링 빈은 @Bean이 붙은 메서드의 명을 스프링 빈의 이름으로 사용한다.(ex. memberService, orderService) 
  • 빈 이름을 직접 부여할 수도 있다. 하지만 빈 이름은 고유해야 한다. 같은 이름을 부여하면 다른 빈이 무시되거나 설정이 덮어버리므로 오류가 발생한다. (중복 불가) ex) @Bean(name="memberService2")
  •  이전에는 개발자가 필요한 객체를 AppConfig를 사용해서 직접 조회했지만, 이제부터는 스프링 컨테이너를 통해서 필요한 스프링 빈(객체)를 찾아야 한다. 스프링 빈은 applicationContext.getBean()메서드를 사용해서 찾을 수 있다.
  • 기존에는 개발자가 직접 자바 코드로 모든 것을 했다면 이제부터는 스프링 컨테이너에 객체를 스프링 빈으로 등록하고, 스프링 컨테이너에서 스프링 빈을 찾아서 사용하도록 변경되었다.
  • 스프링 컨테이너는 XML을 기반으로 만들 수 있고, 애노테이션 기반의 자바 설정 클래스로도 만들 수 있다.
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);

AnnotationConfigApplicationContextApplicationContext라는 인터페이스의 구현체이다.

스프링 컨테이너를 생성할 때는 구성정보를 지정해주어야 하므로, AppConfig.class 전달하였다.

 

- 스프링 컨테이너는 설정 정보를 참고해서 의존관계를 주입한다.

 

 

모든 빈 출력하기

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

애플리케이션 빈 출력하기

  • 스프링이 내부에서 사용하는 빈은 제외하고 내가 등록한 빈만 출력해보자
  • 스프링이 내부에서 사용하는 빈은 getRole()로 구분할 수 있다.
    • ROLE_APPLICATION
    • ROLE_INFRASTRUCTURE

스프링 빈 조회 - 동일한 타입이 둘 이상

  • 타입으로 조회 시 같은 타입의 스프링 빈이 둘 이상이면 오류가 발생한다. 이 때는 빈 이름을 지정하자.
  • ac.getBeansOfType()을 사용하면 해당 타입의 모든 빈을 조회할 수 있다.