[Spring] DI(Dependency Injection) 종합 실습

SEB_BE_43_yeori316·2023년 2월 8일
0

Spring

목록 보기
12/22

1. 스프링 컨테이너

  • ApplicationContext가 스프링 컨테이너

  • 스프링 컨테이너는 @Configuration이 붙은 DependencyConfig를 설정 정보로 사용

  • @Bean이 적힌 메서드를 모두 호출해서 반환된 객체를 스프링 컨테이너에 등록합니다.

직접 자바 코드로 설정 및 등록했던 것을 스프링 컨테이너에 객체만 스프링 빈으로 등록해주고 스프링 컨테이너에서 찾아서 사용하도록 변경된 것입니다.


2. 컴포넌트 스캔

  • 컴포넌트 스캔을 이용해서 스프링 빈을 등록하고 @Autowired를 사용

장점

  • 스프링 빈을 자동으로 찾아 생성해줍니다.
  • 이전에는 직접 @Bean을 통해 설정 정보를 작성하고 의존 관계도 직접 명시했습니다.
  • 설정 정보 자체가 없기 때문에 의존 관계 주입을 클래스 안에서 해결해줍니다.
  • @Componenet 애너테이션이 붙은 클래스를 찾아서 스프링 빈으로 등록해주는 방식입니다.
  • @Configuration

    • 해당 애너테이션에는 @Component가 적용되어있기 때문에 ComponentScan할 때 자동으로 스프링 빈 등록이 됩니다.

    • 만약 이전 설정 파일 (DependencyConfig 등)에 @Configuration 애너테이션이 붙어있으면 @Configurationr이 설정된 파일 자체를 제거하거나 전체 주석 처리를 해야합니다.

    • 이전 설정 파일(@Configuration이 적용된)을 놔두고 싶다면 ComponentScan의 Filter를 사용할 수도 있습니다.
      @ComponentScan(excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Configuration.class))을 추가해줘야합니다.

  • @Autowired

    • @ComponentScan & @Component만 사용했을 때에 DependencyConfig에 어떤 의존 객체를 주입할지 명시해주지 않기 때문에 의존 주입이 필요한 생성자 부분에 @Autowired를 통해 의존 관계 주입이 필요합니다.

3. 추가 실습

BeanDefinition

  • AnntationConfigApplicationContextAnnotatedBeanDefinitionReader를 사용해서 AppConfig.class를 읽고 BeanDefinition을 생성합니다.

  • BeanDefintion 메타정보 확인하기

import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class BeanDefinitionTest {
  public static void main(String[] args) {
    AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(DependencyConfig.class);
    String[] beanDefinitionNames = ac.getBeanDefinitionNames();

    for (String beanDefinitionName : beanDefinitionNames) {
      BeanDefinition beanDefinition = ac.getBeanDefinition(beanDefinitionName);

      if (beanDefinition.getRole() == BeanDefinition.ROLE_APPLICATION) {
        System.out.println("beanDefinitionName = " + beanDefinitionName +
            ", beanDefinition = " + beanDefinition);
      }
    }
  }
}
  • BeanDefinition 정보에는 BeanClassName, Scope, lazyInit 등등 다양한 정보들을 가지고 있습니다.

  • 스프링 컨테이너에 AnnotationConfigApplicationContext를 통해 DependencyConfig.class로 스프링 빈을 등록하면 BeanDefintion을 생성하고 그 안에 다양한 메타 정보들을 갖고 있다.

0개의 댓글