Spring에서의 의존성 주입 방법
@Component
public class Controller{
@Autowired
private Service servic
...
}
- 단일책임의 원칙 위반
- 의존성을 주입하기 쉽기 때문에, @Autoqwired아래에 개수 제한없이 추가할 수 있다.
- 이때, 하나의 class가 많은 책임을 갖고, 순환참조가 이뤄질 수도 있기 때문에
의존성이 높아져, 사용을 피하는것이 좋다.
@Component
public class Controller{
private Service servic
@Autowired
private void setService(Service servic){
this.service = service;
}
}
선택적인 의존성을 사용할때 유용하다. 스프링 3.x 에서는 수정자 주입을 권장하고있다.
- 수정자 주입을 사용하게 되면, service구현제를 주입하지 않아도
controller객체는 생서이 가능하기때문에 널포인터익셉션이 발생할 가능성이 있다.
주입이 필요한 객체가 주입되지 않아도 얼마든지 객체를 생성할 수 있다는것이 문제다.
@Component
public class Service{
private DAO dao;
//생성자
@Autowired
private Service(DAO dao){
this.dao = dao;
}
}
@Component
public class Controller{
private final Service servic = new Service( new DAO( ) );
}
- Spring Framework 에서 권장하는 방법으로,
필수적으로 사용해야하는 의존성 없이는 객체를 만들지 못하도록 강제할 수 있기
때문에 사용을 권장하고 있다.
- Spring 4.3 버전 이후부터는 Class를 완벽하게 DI Framework로 부터
분리할 수 있다.
- 단일 생성자에 한해서 @Autowired를 붙이지 않아도 된다.
- 필드 주입과 수정자 주입은 final로 선언할 수 없지만, 생성자 주입은
final로 필드 객체를 선언하여 런타임에 불변성을 보장한다.
- 앞서 설명한 필드 주입의 모든 단점을 보완할 수 있다.
하지만 실무에서는 필드 주입을 주로 사용한다. 이유 : 가장 구현하기 쉽고, 읽기 편하기 때문이다.