기존에는 setter와 생성자를 통해서 Inversion of Control로 의존성을 주입하는데 Autowired 어노테이션을 이용해서 의존성을 주입할 수 있다.
필요한 의존 객체의 "타입"에 해당하는 빈을 찾아 주입한다.
3가지의 경우에 Autowired를 사용할 수 있다. 그리고 Autowired는 기본값이 true이기 때문에 의존성 주입을 할 대상을 찾지 못한다면 애플리케이션 구동에 실패한다. 다음과 같이 Autowired를 사용할 때의 경우의 수가 존재한다.
생성자 주입은 생성자에 의존성 주입을 받고자 하는 field를 나영하는 방법으로, 권고되는 방법의 하나이다.
member field에 @Autowired 어노테이션을 선언하여 주입받는 방법이다.
setter 메소드에 @Autowired 어노테이션을 선언하여 주입받는 방법이다.
@Service
public class BookService {
private final BookRepository bookRepository;
public BookService(BookRepository bookRepository) {
this.bookRepository = bookRepository;
}
}
BookService는 생성자로 BookRepository를 전달받고 인스턴스 변수를 할당한다.
<bean id="bookRepository" class="~.BookRepository"/>
<bean id="bookService" class="~.BookService">
<constructor-arg name="bookRepository" ref="bookRepository"/>
</bean>
기존에는 xml 파일에 Bean을 설정해주어야 했다.
@Configuration
public class ApplicationConfig {
@Bean
public BookRepository bookRepository() {
return new BookRepository();
}
@Bean
public BookService bookService() {
return new BookService(bookRepository());
}
}
또는 위처럼 xml 설정 파일을 대신하는 java class에서 Bean 설정을 만들어주어 해결할 수도 있다.
@Service
public class BookService {
private BookRepository bookRepository;
@Autowired
public BookService(BookRepository bookRepository) {
this.bookRepository = bookRepository;
}
}
하지만 @Autowired 어노테이션을 사용하는 경우 위와 같이 객체의 의존성을 가지는 부분에 간단히 @Autowired 어노테이션을 사용하면 쉽게 의존성을 주입을 받을 수 있게된다.
@Repository
public class BookRepository { ... }
의존성 주입 타겟이 되는 Class 역시 당연히 Bean으로 등록이 되기위한 @Repository 어노테이션이 부여되어 있다.