최범균님의 스프링 프로그래밍 입문 이라는 책을 통해 공부한 부분을 블로그에 정리하고자 합니다. 잘못되거나 부족한 부분이 있으면 언제든 댓글로 가르침 부탁드립니다.
현재 설정 파일이나 클래스에서 객체를 의존 주입 할 때
다른 설정 파일에서 생성된 객체를 자동으로 의존 주입한다.
의존 주입 기능을 가진 어노테이션은 @Autowired
외에도 @Resource
와 @Inject
가 있다.
@Autowired
는 필드나 메소드 둘다에게 붙일 수 있기 때문에 다음과 같은 3가지 방법이 있다.
위 3가지 방법 모두 설정 파일에서 따로 의존 주입할 필요 없다.
class Phone{
@Autowired
Battery battery;
battery.turnOn();
}
class Phone{
Battery battery;
@Autowired
public Phone(Battery battery){
this.battery = battery;
}
}
class Phone{
Battery battery;
@Autowired
public setBatter(Battery battery){
this.battery = battery;
}
}
@Autowired 사용시 자동 주입할 대상 Bean이 없는 경우 에러가 발생한다.
이를 방지하기 위해서는 @Autowired
에 required 속성을 부여하거나 파라미터에 Optional
, @Nullable
을 붙여 해결할 수 있다.
Autowired할 위치에 @Autowired(required=false)
로 설정하면 대상 bean이 없을 경우 의존 주입하지 않는다.
또한 Optional
이나 @Nullable
을 의존 객체 파라미터 앞에 붙이면 같은 기능을 한다.
class Phone{
Battery battery;
@Autowired
public setBatter(@Nullable Battery battery){
this.battery = battery;
}
}
Optional의 경우
@Nullable Battery battery
부분을Optioal<Battery> battery
처럼 사용한다.
required 속성
과 @Nullable
의 차이점은 메소드 실행 여부에 있다.
required 속성
은 메소드 자체를 실행하지 않는 반면, @Nullable
은 null 값을 할당하여 메소드를 실행한다.
자동 주입 대상 Bean이 여러 개인 경우 자동 주입할 Bean을 선택할 방법이 필요하다. 2가지 방법이 있다.
명시적 의존 주입과 @Autowired를 이용한 자동 주입이 모두 설정된 경우, 명시적 의존 주입이 우선적으로 반영된다.