본문 바로가기
Spring

[스프링] 의존관계 조회(Dependency Lookup) : ObjectFactory, ObjectProvider, JSR-330 Provider

by jeonghaemin 2021. 3. 8.
728x90
@Autowired
HelloService helloService;

스프링에서 위와 같이 외부로부터 의존 관계를 주입받는 것을 의존성 주입이라고 한다.

또한 외부로부터 주입받는 것이 아닌 내가 필요할 때 직접 의존 관계를 찾을 수도 있는데 이것을 '의존관계 조회(Dependency Lookup)'이라고 하고, 의존 관계 조회를 사용하는 3가지 방법을 알아보도록 하자.

  • 스프링에서 제공 : ObjectFactory, ObjectProvider
  • 자바 표준 : JSR-330 Provider

ObjectFactory

@FunctionalInterface
public interface ObjectFactory<T> {

    T getObject() throws BeansException;

}

ObjectFactory의 getObject() 메서드를 호출하면 스프링 컨테이너에서 해당 빈을 찾아서 반환해준다.

public class DLTest {

    @Test
    void ObjectFactoryTest() {
        AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(HelloService.class, HelloController.class);
        HelloService helloService = ac.getBean(HelloService.class);

        HelloController helloController = ac.getBean(HelloController.class);
        
        //의존 관계 조회를 사용해서 반환받은 빈
        HelloController helloControllerDL = helloService.getHelloController();

        System.out.println("helloControllerDL = " + helloControllerDL);
        System.out.println("helloController = " + helloController);

        Assertions.assertEquals(helloController, helloControllerDL);
    }

    static class HelloController { }

    static class HelloService {

        @Autowired
        ObjectFactory<HelloController> helloControllerObjectFactory;

        HelloController getHelloController() {
            return helloControllerObjectFactory.getObject();

        }
    }
}

실행 결과

helloControllerDL = hello.springcorecopy.scope.DLTest$HelloController@60129b9a
helloController = hello.springcorecopy.scope.DLTest$HelloController@60129b9a

실행 결과 getObject() 메서드를 통해서 정상적으로 빈을 가져올 수 있다는 것을 알 수 있다.

ObjectProvider

ObjectFactory를 상속하기 때문에 기본적인 사용법은 똑같이 getObject()를 사용하여 의존 관계를 조회한다.

static class HelloService {

  @Autowired
  ObjectProvider<HelloController> helloControllerObjectProvider;

   HelloController getHelloController() {
   		return helloControllerObjectProvider.getObject();
   }
}

getObject() 메서드만 가지는 단순한 ObjectFactory에 추가적으로 옵션, 스트림 처리 등의 편의 기능이 추가된 것이 ObjectProvider이다.

JSR-330 Provider

ObjectFactory, ObjectProvider는 스프링에서 제공하는 기능이고, JSR330 Provider는 자바 표준에서 제공하는 의존 탐색 조회 기능이다.

public interface Provider<T> {

    T get();
}

ObjectFactory의 getObject()와 같은 기능을 get()메서드가 한다.

static class HelloService {

  @Autowired
  Provider<HelloController> helloControllerProvider;

   HelloController getHelloController() {
           return helloControllerProvider.get();
        }
}

참고

댓글