스프링 핵심 원리 – 기본편


스프링 컨테이너와 스프링 빈


스프링 컨테이너 생성

//스프링 컨테이너 생성
ApplicationContext applicationContext =
 new AnnotationConfigApplicationContext(AppConfig.class);
  • ApplicationContext : 스프링 컨테이너, 인터페이스임(다형성)

image

  • new AnnotationConfigApplicationContext(AppConfig.class) 로 config 정보를 준다.
  • 그러면 스프링 컨테이너가 만들어진다.
  • 스프링 컨테이너 안에는 빈 저장소가 있다.
  • appconfig.class의 구성 정보를 통해 채우게 되는 것이다.

  • 스프링 빈을 AppConfig.class정보를 통해 등록한다.

image

  • 빈의 이름과 객체를 담는데, 빈 이름은 메서드 이름을 사용하고, @Bean(name=””) 으로 이름을 직접 부여할 수도 있다.

  • 단, 항상 다른 빈 이름을 사용하여야 한다~!!!!!!!!!!!!!!!

image

image

컨테이너에 등록된 모든 빈 조회

@Test
 @DisplayName("모든 빈 출력하기")
 void findAllBean() {
 String[] beanDefinitionNames = ac.getBeanDefinitionNames();
 for (String beanDefinitionName : beanDefinitionNames) {
 Object bean = ac.getBean(beanDefinitionName);
 System.out.println("name=" + beanDefinitionName + " object=" +
bean);
 }
 }

스프링 빈 조회 - 기본

  • ac.getBean(빈이름, 타입)
  • ac.getBean(타입)

  • 조회 대상 스프링 빈이 없으면 예외 발생 NoSuchBeanDefinitionException: No bean named ‘xxxxx’ available

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

  • ac.getBean(빈이름, 타입)
MemberRepository memberRepository = ac.getBean("memberRepository1", 
MemberRepository.class)

스프링 빈 조회 - 상속관계

  • 부모 타입으로 조회하면, 자식 타입도 함께 조회한다.
  • 그래서 모든 자바 객체의 최고 부모인 Object 타입으로 조회하면, 모든 스프링 빈을 조회한다.

BeanFactory와 ApplicationContext

image

BeanFactory

  • 스프링 컨테이너의 최상위 인터페이스다.
  • 스프링 빈을 관리하고 조회하는 역할을 담당한다.
  • getBean() 을 제공한다.
  • 지금까지 우리가 사용했던 대부분의 기능은 BeanFactory가 제공하는 기능이다.

ApplicationContext

  • BeanFactory 기능을 모두 상속받아서 제공한다.
  • 빈을 관리하고 검색하는 기능을 BeanFactory가 제공해주는데, 그러면 둘의 차이가 뭘까?
  • 애플리케이션을 개발할 때는 빈을 관리하고 조회하는 기능은 물론이고, 수 많은 부가기능이 필요하다.

차이점?

image

XML 설정

image

  • 최근에는 스프링 부트를 많이 사용하면서 XML기반의 설정은 잘 사용하지 않는다.

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

image

  • AnnotationConfigApplicationContext 는 AnnotatedBeanDefinitionReader 를 사용해서 AppConfig.class 를 읽고 BeanDefinition 을 생성한다.

  • GenericXmlApplicationContext 는 XmlBeanDefinitionReader 를 사용해서 appConfig.xml 설정 정보를 읽고 BeanDefinition 을 생성한다.

  • 새로운 형식의 설정 정보가 추가되면, XxxBeanDefinitionReader를 만들어서 BeanDefinition 을 생성하 면 된다.