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

KJH·2023년 3월 2일
0

컨테이너 생성

ApplicationContext applicationContext = 
	new AnnotationConfigApplicationContext(AppConfig.class);

1. 스프링 컨테이너 생성

  • new AnnotationConfigApplicationContext(AppConfig.class)

2. 스프링 빈 등록

  • 파라미터로 넘어온 설정 클래스 정보를 사용해서 스프링 빈 등록

빈 이름

  • 기본적으로 메서드 이름을 사용
  • 직접 부여 가능 @Bean(name= [...])
  • 빈 이름은 항상 고유해야함

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

  • 객체 생성

4. 스프링 빈 의존관계 설정 - 완료

  • 설정 정보를 참고해서 의존관계 주입

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

  AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);
	@Test
    @DisplayName("애플리케이션 빈 출력하기")
    void findApplicationBean(){
        String[]beanDefinitionNames = ac.getBeanDefinitionNames();
        for (String beanDefinitionName : beanDefinitionNames) {
            BeanDefinition beanDefinition = ac.getBeanDefinition(beanDefinitionName);

            // ROLE_APPLICATION : 직접 등록한 애플리케이션 빈
            // ROLE_INFRASTRUCTURE : 스프링이 내부에서 사용하는 빈
            if (beanDefinition.getRole() == BeanDefinition.ROLE_APPLICATION){
                Object bean = ac.getBean(beanDefinitionName);
                System.out.println("name = " + beanDefinitionName + "obejct = " + bean);
            }
        }
    }

빈 조회

가장 기본적인 조회 방법

  • ac.getBean(이름, 타입)
  • ac.getBean(타입)
  • 없으면 예외발생

동일한 타입 2개이상

  • 타입으로 조회시 오류 (이름지정필수)
  • ac.getBeanOfType()

상속관계

  • 부모 타입으로 조회하면, 자식 타입도 함께 끌려나옴

BeanFactory와 ApplicationContext

  • ApplicationContext는 BeanFactory 상속받음
  • 빈 관리기능 + 부가기능
  • 이것이 컨테이너!!

ApplicationContext 기능

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

다양한 설정 지원

스프링 컨테이너는 다양한 설정 정보를 받아들일 수 있음

어노테이션 기반

  • new AnnotationConfigApplicationContext(AppConfig.class)
  • 자바 코드로 된 설정정보를 넘기면 됨

XML

  • GenericXmlApplicationContext 사용
ApplicationContext ac = new GenericXmlApplicationContext("appConfig.xml");
MemberService memberService = ac.getBean("memberService", MemberService.class);

설정 메타 정보 -BeanDefinition

스프링은 자바 코드던, xml이던 상관없이읽어서 BeanDefinition을 민든다.

bean당 하나씩 메타 정보가 생성되고,스프링 컨테이너가 이를 기반으로 스프링 빈을 생성한다.

스프링이 다양한 형태의 설정 정보를 BeanDefinition으로 추상화해서 사용한다 정도만 이해하자.


0개의 댓글