의존관계를 주입할 빈이 없을 때!
@Autowired(required=false) : 자동 주입할 대상이 없으면 메서드 자체가 호출이 안됨
org.springframework.lang.@Nullable : 자동 주입할 대상이 없으면 null 이 입력됨. -> 생성자에서도 가능
Optional<> : 자동 주입할 대상이 없으면 Optional.empty 이 입력됨. -> 생성자에서도 가능
아래 코드에서 Member는 스프링 빈이 아니어서 세 함수의 Autowired는 기본적으론 예외를 발생시킴
public class AutowiredTest {
@Test
void AutowiredOption() {
ApplicationContext ac = new AnnotationConfigApplicationContext(TestBean.class);
}
static class TestBean{
@Autowired(required = false)
public void serNoBean1(Member noBean1) {
System.out.println("noBean1 = " + noBean1);
}
// 실행하지 않음
@Autowired
public void setNoBean2(@Nullable Member noBean2) {
System.out.println("noBean2 = " + noBean2);
}
// noBean2 = null
@Autowired
public void setNoBean3(Optional<Member> noBean3){
System.out.println("noBean3 = " + noBean3);
}
// noBean3 = Optional.empty
}
}
* 의존관계 주입 방법 중 생성자 주입을 우선으로 사용하는 이유
대부분의 의존관계 주입은 처음 어플리케이션 시작할 때 정해지고, 거의 변하지 않는다. (변하지 않는 게 좋다)
생성자 주입을 객체를 생성할 때 딱 1번만 호출되므로 의존관계를 불변하게 설계할 수 있다.
+ 필드 값을 final 로 지정할 수 있다.
또, Setter 주입을 사용하면, 객체 생성 시 파라미터를 누락하는 경우가 발생할 수 있다.
그러나 생성자 주입을 사용하면 이걸 컴파일 오류로 잡을 수 있어 누락을 방지할 수 있다.
그리고 final 키워드를 통해 생성자에서 누락하는 것을 컴파일 오류로 잡아 이것 도 누락을 방지할 수 있다.
Lombook
getter, setter 함수를 자동으로 만들어준다.
@Getter
@Setter
어노테이션을 달면 사용 가능
@RequiredArgsConstructor
final 필드값을 생성자로 자동으로 만들어준다.
@Component
@RequiredArgsConstructor
public class MemberServiceImpl implements MemberService {
private final MemberRepository memberRepository;
}
'코딩 > JAVA 공부' 카테고리의 다른 글
| [Spring] 빈 스코프 (0) | 2023.05.20 |
|---|---|
| [Spring] 다중 등록 빈 의존 관계 문제 (0) | 2023.05.19 |
| [Spring] 의존성 관계 자동 주입 (1) | 2023.05.14 |
| [Spring] 컴포넌트 스캔 (0) | 2023.05.13 |
| [Spring] 스프링 컨테이너 생성 및 Bean 등록 (0) | 2023.05.12 |