의존관계를 외부에서 주입(Dependency Injection: DI) 받는게 아니라 이렇게 직접 필요한 의존관계를 찾는 것을 Dependency Lookup(DL) 의존관계 조회(탐색) 이라고 한다.

ObjectProvider

지정한 빈을 컨테이너에서 대신 찾아주는 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;

JSR-330 Provier

ObjectProvider 는 스프링에 의존적이다. 스프링에 의존적이지 않는 프로젝트를 위해서 별도의 라이브러리가 존재한다.

dependencies {
		implementation 'javax.inject:javax.inject:1'
}
package javax.inject;

public interface Provider<T> {

		T get();
}

참고

스프링을 사용하다보면 이 기능뿐만 아니라 다른 기능들도 자바 표준과 스프링이 제공하는 기능이 겹칠 때가 많다. 대부분 스프링이 더 다양하고 편리한 기능을 제공해주기 때문에, 특별히 다른 컨테이너를 사용할 일이 없다면 스프링이 제공하는 기능을 사용하자.