본문 바로가기

SERVER/Spring

[spring-core-2] 스프링 컨테이너와 스프링 빈

인프런 [스프링 핵심 원리 - 기본편]을 정리한 내용입니다.

스프링 컨테이너

ApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class)

 

- ApplicationContext를 스프링 컨테이너라 한다.

- ApplicationContext는 인터페이스이고, AnnotationConfigApplicationContext는 구현체이다. 즉, 역할과 구현으로 나누어 다형성을 적용한 것이다.

- 역할과 구현으로 나누었기 때문에 스프링 컨테이너는 xml 기반으로 만들 수도 있고, 애노테이션 기반으로 자바 설정 클래스를 만들 수도 있다.

 

다양한 설정 형식 지원 - 자바코드, XML

 

- 애노테이션 기반 자바 코드 설정 사용

ApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class)

 

👀 AppConfig.class

 

 

- XML 설정 사용

ApplicationContext ac = new GenericXmlApplicationContext("appConfig.xml")

 

👀 appConfig.xml

 

 

스프링 빈 설정 메타 정보 - BeanDefinition

 

 스프링이 다양한 설정 형식을 지원할 수 있는 이유는?

 역할과 구현을 나누었기 때문...!

 

- BeanDefinition이라는 인터페이스(추상화)가 존재. 스프링 컨테이너는 오직 BeanDefinition에만 의존한다.

- BeanDefinition의 구현체인 XML, 자바 코드는 갈아끼울 수 있다.

- BeanDefinition을 빈 설정 메타정보라 한다. @Bean, 당 각각 하나씩 메타 정보가 생성되고, 스프링 컨테이너는 이러한 메타정보를 기반으로 스프링 빈을 생성한다.

 

 

AnnotationConfigApplicationContext의 경우 AnnotatedBeanDefinitionReader를 통해 AppConfig.class를 읽고 BeanDefinition을 생성하는 것.

 

BeanDefinition 정보

BeanClassName, factoryBeanName, factoryMethodName, Scope, lazyInit, InitMethodName, DestroyMethodName, Constructor arguments, Properties 등이 존재.

 

👀 자바 설정 파일과 XML의 차이점

 

XML의 경우 bean class에 직접 클래스 경로를 표시하고 있지만, 자바 설정 파일은 팩토리 메소드를 사용하여 factoryBeanName과 factoryMethodName이 해당 정보를 가짐.(class는 null로 표시)

 

- appConfig.xml로 등록 시 BeanDefinition 일부

 

 

- AppConfig.class로 등록 시 BeanDefinition 일부

 


BeanFactory와 ApplicationContext

  • BeanFactory
    • 스프링 컨테이너 최상위 인터페이스
    • 스프링 빈을 관리하고 조회하는 역할을 담당
  • ApplicationContext
    • BeanFactory의 기능을 모두 상속받아서 제공
    • 빈을 관리하고 조회하는 기능 외, 애플리케이션을 관리하기 위한 수 많은 부가기능을 제공
    • 부가기능
메시지소스를 활용한 국제화 기능
환경변수
애플리케이션 이벤트
편리한 리소스 조회

스프링 빈 조회

  • ac.getBean(빈이름, 타입) or ac.getBean(타입)
  • 타입으로 조회 시 동일한 타입이 둘 이상이라면, 중복 오류가 발생한다. -> 빈 이름을 지정
  • ac.getBeansOfType()을 사용하면 해당 타입의 모든 빈의 key, value가 Map으로 주어진다.
  • 부모 타입으로 조회하면, 모든 자식 타입도 함께 조회되므로 중복 오류가 발생한다. -> 빈 이름을 지정
  • 특정 하위 타입으로 조회해도 되지만, 추상화가 된 부모 타입으로 조회하는 것이 더 선호되는 방식.
  • 자바 객체의 최고 부모인 Object 타입으로 조회하면, 모든 스프링 빈을 조회할 수 있다.