컴포넌트 스캔과 의존성 주입 DI

고승원·2022년 11월 3일
0

TIL

목록 보기
6/24

의존성 주입 (Dependency Injection)

  • 전략패턴
  • 서비스 로케이터 패턴
  • 팩토리 패턴
  • 의존관계 주입 패턴

이 생성자에 주입하는 패턴을 생성자 주입패턴(DI) 라고 한다.

@Configuration
public class ExampleConfig {
    @Bean
    public A a(B b) {
        return new A(b);
    }
}

의존관계를 주입할 때 참조 순환 관계(Circular dependencies) 에 대해 유의하자.

@Configuration
public class CircularConfig {
    @Bean
    public A a(B b) {
        return new A(b);
    }

    @Bean
    public B b(A a) {
        return new B(a);
    }
}

관련 어노테이션

@ComponentScan

  • 스캔 위치를 설정한다.
  • 어떤 Annotation을 스캔할지 또는 하지 않을지 결정하는 Filter 기능을 가지고있다. (basePackages, basePackageClasses)

@Autowired

  • setter / constructor 로 의존성 주입을 할 시 자동으로 해준다. → 생성자 두개는 안된다.
  • spring 4.3 부터 자동 생성

@Primary

  • 하나의 인터페이스를 상속받는 두개의 구현 클래스가 겹치는 경우 @Primary 붙은 구현 클래스가 주입된다.

@Qualifier

  • 하나의 인터페이스를 상속받는 두개의 구현 클래스가 겹치는 경우 @Qualifier로 Bean의 이름을 지정할 수 있다.
var voucherRepository = BeanFactoryAnnotationUtils.qualifiedBeanOfType(
													applicationContext.getBeanFactory(), 
													VoucherRepository.class, 
													"memory");

Bean Scope

  • Singleton - default
  • Prototype
  • Request
  • Session
  • Application
  • Websocket

Scope 변경 하는 법

@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)

Bean이 생성되기 전에 실행하는 메서드

  1. 빈 내에 @PostConstruct 어노테이션이 붙은 메서드
  2. 빈에 InitializingBean implements
  3. @Bean의 initMethod 속성 사용

Bean이 사라지기 전에 실행하는 메서드

  1. @Bean의 destroyMethod 속성 사용
  2. 빈에 DisposableBean Implements
  3. 빈 내에 PreDestroy 어노테이션이 붙은 메서드

정리

컴포넌트 스캔과 의존성 주입

  • 의존성 주입은 필드 주입, 세터주입, 생성자 주입, 어노테이션이 있다.
  • circular dependencies가 생기지 않게 유의하자.
  • 빈 생성과 의존성 주입은 어노테이션을 이용해 편리하게 사용할 수 있다.
  • 빈 생성이 겹치는 경우 @Primary, @Qualifier를 사용한다. (이런 일이 거의 없음)
  • 빈 생성/삭제 전 중 후에 메서드 실행 가능.
profile
봄은 영어로 스프링

0개의 댓글