37일차(DI/빈 생명주기/컴포넌트 스캔/의존성 자동주입)

Rina's·2023년 6월 1일

코드스테이츠

목록 보기
36/96

빈 생명주기

컨테이너 초기화

interface InitializingBean -> afterPropertiesSet()
빈 객체 생성, 의존성 주입, 초기화

ApplicationContext applicationContext = new AnnotationConfigApplicationContext(TestConfigurer.class);

컨테이너 사용

Menu menu = applicationContext.getBean("menu", Menu.class);

빈 조회

컨테이너 종료

interface DisposableBean -> destroy()
빈 소멸

applicationContext.close();

InitializingBean(초기화), DisposableBean(소멸시점)을 구현 및 오버라이딩하여 적절한 타이밍에 특정 기능을 넣을 수 있다.

만약 기존 InitializingBean(), DisposableBean() 이름 대신 다른 이름을 쓰고 싶다면

iniMethod 속성과 destroyMethod 속성 값을 변경하는 방법
@Bean(initMethod = "대체이름", destroyMethod = "대체이름")
속성은 기본적으로 자동으로 추론되어 등록된다

@PostConstruct와 @PreDestory 애너테이션을 활용하는 방법
초기화 메서드에 @PostConstruct, 소멸 메서드에 @PreDestroy를 넣어 작동

@Scope

빈 객체의 관리 범위

  • 싱글톤
  • 프로토타입(prototype)
  • 세션(session)
  • 리퀘스트(request)

@Scope("prototype")를 이용해 빈의 관리범위를 기본값인 싱글톤에서 프로토탑으로지정할 수 있다

테스트가 실패하며 주소값이 다르게 표시됨을 확인 할 수 있다

@Component

@Configuration@Bean을 사용한 수동 주입 방식에서
@Component@Autowired을 사용해 자동으로 빈을 등록할 수 있게 해준다

따로 설정을 하지 않는다면 @ComponentScan이 붙은 클래스의 패키지가 스캔의 시작 위치가 된다. 스캔 대상이 패키지(해당 클래스 위치)를 최상단에 두도록 하자.
범위를 변경하고 싶다면 @ComponentScan(basePackages = “”)를 사용하면 된다.

스프링 컨테이너 객체 생성시 참조 클래스를
AppConfigurer 에서 TestConfigurer.class 로 변경
클래스 위에 @Component, 생성자 위에 @Autowired 입력

이 외에 스캔 타겟 지정 @Configuration, @Controller, @Service, @Repository

@Autowired

컨테이너 스캔영역 내에 가져올 스프링빈의 타입과 이름이 중복 될 경우 NoUniqueBeanDefinitionException 가 발생한다

@Autowired로 대상을 직접 지정시 오류가 표시된다

해결 방법

@Autowired 필드명 매칭

중복되는 타입의 필드명을 중복되지 않도록 수정해 준다

@Qualifier 사용

구분자 이름을 추가로 지정해 준다

@Primary 사용

우선적으로 사용하는 빈을 지정 해 준다(호출하는 스프링 빈 클래스에 설정)

profile
갭린이 리나

0개의 댓글