스프링/기본

BeanFactory와 ApplcaitonContext

o_b:us 2022. 5. 31. 15:44

BeanFactory 와 ApplicationContext


IoC 컨테이너라고 하는 스프링 컨테이너는 DI의 관점에서는 BeanFactory라고도 하고, ApplicationContext라고도 합니다.


BeanFactory는 기본적인 bean의 getBean()(조회기능)을 제공하는 최상위 인터페이스입니다.ApplicationContext는 BeanFactory를 상속받아 부가적인 기능을 추가한 인터페이스입니다.


일반적으로 스프링의 IoC 컨테이너는 애플리케이션 컨텍스트를 말하게 됩니다.

BeanFactory - Lazy loading

ApplicationContext - Eager loading

또한 둘의 차이점으로써 BeanFactory는 on-demand방식으로 빈을 사용시에만 로딩시켜줍니다. 반면에 ApplicationContext는 실행시 모든 빈을 로딩하게 됩니다.



스프링 컨테이너<스프링 빈 저장소>


빈 이름 빈 객체
빈 1 빈 객체1
빈 2 빈 객체2
빈 3 빈 객체3

@Bean
public MemberService memberService() {
  return new MemberServiceImpl(memberRepository());
}

빈 애노테이션을 사용하면 스프링 컨테이너의 빈 저장소에 위처럼 빈 1(ex memberService), 빈 객체(MemberServiceImpl@x01)로 등록을 해줍니다.

스프링은 등록된 모든 빈을 생성하고, 그 다음 의존관계를 주입하는 단계로 이루어진다.(미리 생성하지 않으면 의존관계를 주입하기 어렵기 때문에) 또한 상속관계에 있는 빈을 조회시에 부모 타입으로 조회하면 자식타입 또한 조회로 딸려온다.

빈 가져오는 코드



import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class Main{

//1. 어노테이션 기반 빈설정
  void annotationContext(){
    ApplicationContext applicationContext = new AnnotationConfigApplicationContext(Appconfig.class);

    MemberService memberService = applicationContext.getBean("memberService", MemberService.class);
  }
//2. xml기반 빈 설정
    void xmlContext(){
        ApplicationContext applicationContext = 
        new GenericXmlApplicationContext("appConfig.xml");
        MemberService memberService = applicationContext.getBean("memberService", MemberService.class);
    }
}



BeanDefinition(Bean의 정보 가져오기)


자바코드기반으로 @Bean을 설정할 것인지 XML기반으로 <bean>을 생성할 것인지,
스프링컨테이너는 이 메타 정보(구현체)를 기반으로 스프링 빈을 생성한다.

위의 사진을 보면 @Bean의 메타정보를 읽을 수 있는 AnnotatedBeanDefinitionReader 이용해서 BeanDefinition을 읽을 수 있다.

반면에 xml기반으로 <Bean>의 메타정보를 읽을 수 있는 XmlBeanDefinitionReader를 이용해서 BeanDefinition의 정보를 읽을수 있다.

BeanDefinition의 정보

BeanClassName : 생성할 빈의 클래스 명
facotryBeanName : 팩토리 역할의 빈을 사용할 경우 이름 ex)appConfig
Scope: 싱글톤(기본값)
등등 기타 정보는 좀 찾아보면서 쓰는게 좋을 거같다


어노테이션을 사용함으로써 이점


자바로 짠 코드를 @Configuration, @Bean 등을 이용하여 스프링 컨테이너에 등록하여 쓰도록 하였다. 과연 이것들을 씀으로써 얻는 장점이 뭘까? 어노테이션을 사용하기 이전에는 xml파일에 bean을 등록하면서 사용하였다. 이 때 외부 설정 파일로 따로 따로 소스코드를 등록하고 삭제하고 수정하는 번거로움이 있었지만 어노테이션을 사용함으로써 이를 스프링에게 역할을 분담시킨것이다.



https://bit.ly/3wXOM5L

'스프링 > 기본' 카테고리의 다른 글

좋은 객체 지향 설계(SOLID)  (0) 2022.05.25