Written by
Poogle
on
on
2021.08.18 TIL
새롭게 배운 것 Done
운동
- 오전 러닝 - 2.5km
독서
알고리즘
코딩
@Autowired
- 해당 타입의 빈을 찾아서 필드에 할당
- 스프링 빈에 의존하는 다른 빈을 자동으로 주입하고 싶을 때 사용
- 필드나 메서드 둘 다 가능
@Autowired
적용 대상에 일치하는 빈이 없으면?
UnsatisfiedDependecyException
->NoSuchBeanDefinitionException: No qualifying bean of type ~ available: expected at least 1 bean which qualifies autowire candidate
@Autowired
붙인 주입 대상에 일치하는 빈이 두 개 이상이면?
UnsatisfiedDependecyException
->NoUniqueBeanDefinitionException: No qualifying bean of type ~ available: expected single matching bean but found 2
@Qualifier
없으면 빈의 이름을 한정자로 지정
- 자동 주입할 빈을 지정하기
@Primary
: 하나만 고르는것 -> 주로 많이 씀, 사용하는 곳에서 생각하지 않도록 하려고
@Autowired
붙인 타입에 해당하는 빈이 존재하지 않으면 익셉션 발생
- required 속성 T/F로 관리
- false: 일치하는 빈이 없으면 값 할당 자체를 하지 않음
- Optional 사용
@Nullable
사용
- 자동 주입할 빈이 존재하지 않아도 메서드가 호출됨
- 의존 주입 대상이 존재하지 않으면 null을 값으로 전달
Component Scan
- 스프링이 직접 클래스를 검색 -> 빈으로 등록
@Component
: 해당 클래스를 스캔 대상으로 표시basePackages
: 스캔 대상 패키지 목록excludeFilters = @Filter(type = ~, classes = ~)
: 뺄 것
- 스캔할 때 사용하는 빈 이름과 수동 등록한 빈 이름이 같은 경우 수동 등록한 빈이 우선
Bean Life Cycle
- 객체 생성 -> 의존 설정 -> 초기화 -> 소멸
//1. 컨테이너 초기화 -> 빈 객체의 생성, 의존 주입, 초기화
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppContext.class);
//2. 컨테이너에서 빈 객체를 구해서 사용
OrderService orderService = context.getBean("orderService", OrderService.class);
String message = orderServcie.print("주문");
System.out.println(message);
//3. 컨테이너 종료 -> 빈 객체의 소멸
context.close();
public interface InitializingBean {
void afterPropertiesSet() throws Exception;
}
public interface DisposableBean {
void destroy() throws Exception;
}
- 초기화, 소멸 과정
- DB 커넥션 풀에서 필요
- 채팅 클라이언트가 서버와의 연결을 생성하고 끊는 작업을 초기화, 소멸 시점에 수행
@Bean(initMethod = "", destroyMethod = "")
로 커스텀 메서드 지정 가능
@Scope("prototype")
으로 싱글톤 범위 객체가 아니라 프로토타입 범위의 빈 설정할 수 있음 -> 매번 새로운 객체 생성 => 소멸 처리도 코드에서 직접 해야 함
참고: 책 - 스프링5 프로그래밍 입문 - 최범균
깨달은 점 FEELING
@Autowired
어노테이션을 잘못 붙인건지 실습할 때 계속 에러가 난다… 어디서 난 건지 알 수가 없어서 너무 답답한 상황인데 하나하나 디버깅을 해봐야겠다.😂