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

Ho·2022년 7월 13일
0

Spring

목록 보기
3/8

스프링 컨테이너 생성

ApplicationContext applicationContext = 
	new AnnotationConfigApplicationContext(AppConfig.class);
  • ApplicationContext 를 스프링 컨테이너라 한다.
  • ApplicationContext 는 인터페이스이다.
  • 스프링 컨테이너는 XML 기반으로 만들 수 있고 Annotation 기반의 자바 설정 클래스로도 만들 수 있다.
  • AnnotationConfigApplicationContextApplicationContext 인터페이스의 구현체이다.

스프링 컨테이너의 생성 과정

1. 스프링 컨테이너 생성

스프링 컨테이너를 생성할 때 구성 정보를 지정해준다 (예제에서는 AppConfig.class)

2. 스프링 빈 등록

스프링 컨테이너는 파라미터로 넘어온 설정 클래스의 정보를 사용하여 스프링 빈을 등록한다.

Bean 이름

  • Bean의 이름은 메서드의 이름을 사용한다.
  • Bean의 이름을 직접 부여할 수 도있다.
  • Bean의 이름은 고유한 이름을 부여해야 한다.

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

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


스프링 빈 조회

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

public class ApplicationContextInfoTest {
    AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);

    @Test
    void findAllBean() {
        String[] beanDefinitionNames = ac.getBeanDefinitionNames();
        for (String beanDefinitionName : beanDefinitionNames) {
            Object bean = ac.getBean(beanDefinitionName);
            System.out.println("beanDefinitionName = " + beanDefinitionName + ", object = " + bean);
        }
    }
}
  • ac.getBeanDefinitionNames() : 스프링 컨테이너에 등록된 모든 빈 이름을 조회한다.

애플리케이션 빈 출력하기

@Test
void findApplicationBean() {
    String[] beanDefinitionNames = ac.getBeanDefinitionNames();
    for (String beanDefinitionName : beanDefinitionNames) {
        BeanDefinition beanDefinition = ac.getBeanDefinition(beanDefinitionName);

        //Role ROLE_APPLICATION: 직접 등록한 애플리케이션 빈
        //Role ROLE_INFRASTRUCTURE: 스프링이 내부에서 사용하는 빈
        if (beanDefinition.getRole() == BeanDefinition.ROLE_APPLICATION) {
            Object bean = ac.getBean(beanDefinitionName);
            System.out.println("beanDefinitionName = " + beanDefinitionName + ", object = " + bean);
        }
    }
}
  • ac.getBeanDefinition() : 파라미터로 빈 이름을 넘기면 BeanDefinition을 가져올 수 있다.
  • beanDefinition.getRole() 으로 애플리케이션 빈인지 스프링이 사용할 빈인지 확인할 수 있다.

빈 이름으로 조회

void findBeanByname() {
    MemberService memberService = ac.getBean("memberService", MemberService.class);
}

Configuration의 메서드 이름이 스프링빈의 이름이 되므로 이를 이용하여 빈을 가져올 수 있다.

타입으로 조회

void findBeanByType() {
    MemberService memberService = ac.getBean(MemberService.class);
}

타입으로만 조회하는 경우 같은 타입의 스프링 빈이 둘 이상이면 오류가 발생한다. 같은 타입이 존재하는 경우 빈 이름을 지정해야한다.

특정 타입 모두 조회하기

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

getBeansOfType()을 이용하여 스프링빈의 이름과 스프링빈을 Map의 key, value로 가져올 수 있다.


스프링 빈 조회 - 상속관계

  • 부모 타입으로 조회하면 자식 타입도 함께 조회한다.
  • Object 타입으로 조회하면 모든 스프링빈을 조회한다.
  • 타입으로만 조회시 자식 타입의 스프링 빈이 둘 이상 있으면 중복 오류 발생하므로 이름을 지정해야한다.

BeanFactory와 ApplicationContext

BeanFactory

  • 스프링 컨테이너의 최상위 인터페이스
  • 스프링 빈을 관리하고 조회하는 역할
  • getBean() 제공

ApplicationContext

  • BeanFactory의 기능을 모두 상속받아 제공한다.
  • 부가기능 제공
    • 메세지 소스를 활용한 국제화 기능
    • 환경변수
    • 애플리케이션 이벤트
    • 리소스 조회

BeanFactory 또는 ApplicationContext를 스프링 컨테이너라 한다


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

  • 스프링은 BeanDefinition이라는 추상화를 통해 다양한 설정 형식을 지원한다.
  • 역할과 구현을 개념적으로 나눈 것
  • XML, java 등을 읽어서 BeanDefinition을 만든다.
  • 컨테이너 입장에서는 BeanDefinition만 알면 된다.
  • BeanDefinition을 빈 설정 메타정보라 한다.
  • @Bean 하나당 메타정보가 생성된다.
  • 스프링 컨테이너는 이 메타정보를 기반으로 스프링 빈을 생성한다.


BeanDefinition 정보

  • BeanClassName : 생성할 빈의 클래스 명
  • factoryBeanName : 팩토리 역할을 하는 빈의 이름
  • factoryMethodName: 빈을 생성할 팩토리 메서드 지정
  • Scope: 싱글톤(기본)
  • lazyInit : 스프링 컨테이너를 생성할때 빈을 생성하지 않고 사용하는 시점까지 생성을 지연처리 할지에 대한 여부
  • InitMethondName: 빈을 생성하고 의존관게를 적용한 뒤에 호출되는 초기화 메서드 명
  • DestroyMethodName: 빈의 생명주기가 끝나서 제거하기 직전에 호출되는 메서드명

0개의 댓글