의존관계를 외부에서 주입(Dependency Injection: DI) 받는게 아니라 이렇게 직접 필요한 의존관계를 찾는 것을 Dependency Lookup(DL) 의존관계 조회(탐색) 이라고 한다.
지정한 빈을 컨테이너에서 대신 찾아주는 DL 서비스를 제공하는 것이 바로 ObjectProvider
이다. 참고로 과거에는 ObjectFactory 가 있었는데 여기에 편의 기능을 추가해서 ObjectProvider 가 만들어졌다.
// PrototypeBean : prototype 인 클래스
@Autowired
private ObjectProvider<PrototypeBean> prototypeBeanProvider;
public int logic() {
// getObject() 호출 시 스프링 컨테이너에서 빈 호출
PrototypeBean prototypeBean = prototypeBeaProvider.getObject();
prototypeBean.addCount();
return prototypeBean.getCount();
}
ObjectProvider 는 스프링 컨테이너에 있는 빈을 호출해주는 역할을 한다. ApplicationContext 의 로직을 호출하는 것이므로 동일한 결과를 주지만, 기능이 단순하므로 단위테스트를 만들거나 mock 코드를 만들기 훨씬 쉬워진다. 다만 ObjectFactory 나 ObjectProvider 는 스프링에 의존적이다.
import org.springframework.beans.factory.ObjectFactory;
import org.springframework.beans.factory.ObjectProvider;
ObjectProvider 는 스프링에 의존적이다. 스프링에 의존적이지 않는 프로젝트를 위해서 별도의 라이브러리가 존재한다.
dependencies {
implementation 'javax.inject:javax.inject:1'
}
package javax.inject;
public interface Provider<T> {
T get();
}
스프링을 사용하다보면 이 기능뿐만 아니라 다른 기능들도 자바 표준과 스프링이 제공하는 기능이 겹칠 때가 많다. 대부분 스프링이 더 다양하고 편리한 기능을 제공해주기 때문에, 특별히 다른 컨테이너를 사용할 일이 없다면 스프링이 제공하는 기능을 사용하자.