주입할 스프링 빈이 없어도 동작해야 할 때가 있다.
그런데 @Autowired 만 사용하면 required 옵션의 기본값이 true 로 되어 있어서
자동 주입 대상이 없으면 오류가 발생한다.
먼저, 기존에 작성했던 모든 test를 실행시키면 특정 test 코드에서 오류가 뜬다.
AutoAppConfig에서 아래 코드를 주석처리하고 실행시키면 정상적으로 test가 실행된다.
@Configuration
@ComponentScan(excludeFilters = @ComponentScan.Filter (type= FilterType.ANNOTATION, classes = Configuration.class))
public class AutoAppConfig {
// // 중복 등록과 충돌
// @Bean(name = "memoryMemberRepository")
// MemberRepository memberRepository() {
// return new MemoryMemberRepository();
// }
}
그 이유는 스프링 빈이 컴포넌트 스캔으로 등록이 되어있는데
수동으로 또 등록이 되어서 스프링부트는 오류를 내버린다.
(스프링 부트 test 였기 때문에 오류생김)
자동 주입 대상을 옵션으로 처리하는 방법은 다음과 같다.
▪ @Autowired(required=false) : 자동 주입할 대상이 없으면 수정자 메서드 자체가 호출 안됨 ▪ org.springframework.lang.@Nullable : 자동 주입할 대상이 없으면 null이 입력된다.
▪ Optional<> : 자동 주입할 대상이 없으면 Optional.empty 가 입력된다.
* java 8 의 Optional : 값이 있을 수도 있고 null 일 수도 있는 상태를 감싼 것
ApplicationContext ac = new AnnotationConfigApplicationContext(TestBean.class);
TestBean.class 가 스프링 빈으로 등록을 한다. 컴포넌트 스캔 하는 것처럼
Member는 스프링 빈이 아니다. (스프링 컨테이너에 관리되는 게 아니다.)
→ @Autowired(required=true) or @Autowired 로 실행하면 예외가 터진다.
Member가 스프링 빈으로 등록된 것이 아니기 때문에
출력 결과
setNoBean1() 은 @Autowired(required=false) 이므로 호출 자체가 안된다.
의존관계가 없으므로 ⬇️이 메소드 자체가 호출이 아예 안된다.
@Autowired(required = false)
public void setNoBean1(Member noBean1) {
System.out.println("noBean1 = " + noBean1);
}
Nullable은 호출은 되는데 null로 들어온다.
Optional은 들어오면 Optional.empty로 넣어준다. 값이 있으면 Optional 안에 값이 감싸져 있을 것이다.
* @Nullable, Optional은 스프링 전반에 걸쳐서 지원된다.
예를 들어서 생성자 자동 주입에서 특정 필드에만 사용해도 된다.
'TIL' 카테고리의 다른 글
222일차(모험 131일차) (0) | 2022.04.25 |
---|---|
219일차(모험 128일차) (0) | 2022.04.22 |
217일차(모험 126일차) - 다양한 의존관계 주입 방법 (0) | 2022.04.19 |
216일차(모험 125일차) - 오류 (0) | 2022.04.18 |
213일차(모험 122일차) - 웹소켓 삽질 중 (0) | 2022.04.15 |