반응형
스프링 5 버전부터는 @Autowired 애노테이션의 required 속성을 false 하는 대신 의존 주입 대상에 자바 8의 Optional을 사용할 수 있다.
자동 주입 대상 타입이 Optional인 경우, 일치하는 빈이 존재하지 않으면 값이 없는 Optional을 인자로 전달하여 exception이 발생하지 않으며, 일치하는 빈이 존재하면 해당 빈을 값으로 갖는 Optional을 인자로 전달한다.
@Autowired(required = false)
public void setDateFormatter(DateTimeFormatter dateTimeFormatter) {
this.dateTimeFormatter = dateTimeFormatter;
}
다음과 같은 코드는 Optional을 사용하면 다음과 같이 변경할 수 있다.
@Autowired
public void setDateFormatter(Optional<DateTimeFormatter> formatterOpt) {
if (formatterOpt.isPresent()) {
this.dateTimeFormatter = formatterOpt.get();
} else {
this.dateTimeFormatter = null;
}
}
DateTimeFormatter 객체를 담을 수 있는 Optional객체를 인자로 받아서 값이 존재한다면 그 값을 받아오고, 그렇지 않으면 null값을 넣도록 합니다.
@Autowired
public void setDateFormatter(Optional<DateTimeFormatter> formatterOpt) {
this.dateTimeFormatter = formatterOpt.orElse(null);
}
orElse() 설명을 읽어보니 formatterOpt의 값이 존재하면 값을 반환하고 없다면 other을 반환한다고 해서 한 줄로 줄여봤습니다.
@Nullable 애노테이션을 사용하는 방법도 존재합니다.
@Autowired
public void setDateFormatter(@Nullable DateTimeFormatter datetimeFormatter) {
this.dateTimeFormatter = datetimeFormatter;
}
@Nullable 애노테이션을 의존 주입 대상 파라미터에 붙이면 setter메서드를 spring container가 호출할 때 자동 주입할 빈이 존재하면 해당 빈을 전달하고 그렇지 않으면 null을 전달합니다.
required = false와 @Nullabel 차이점은 다음과 같다.
- required속성이 false인 경우 대상 빈이 존재하지 않으면 메서드를 호출하지 않습니다.
- 그와 반대로 @Nullable 같은 경우는 빈이 존재하지 않아도 메서드가 호출된다는 것입니다.
반응형
'Spring|Spring-boot' 카테고리의 다른 글
Spring Security(3) (0) | 2021.03.28 |
---|---|
[Spring ] 빈 객체의 초기화와 소멸 (0) | 2021.01.25 |
JWT(2) (0) | 2020.08.18 |
Json Web Tokens(1) (0) | 2020.08.14 |
회원가입을 위한 Spring security (0) | 2020.08.09 |
댓글