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();
}
}
참고
'Spring' 카테고리의 다른 글
[스프링 MVC] 요청 파라미터 조회하기 - @RequestParam, @ModelAttribute (0) | 2021.07.07 |
---|---|
[스프링] 프록시(Proxy) (0) | 2021.03.08 |
스프링 @Autowired : 같은 타입의 빈이 여러개라면?(@Qualifier, @Primary) (0) | 2021.02.26 |
[스프링] 빈 초기화, 소멸 메소드 사용하기 (0) | 2021.01.12 |
[스프링] Cookie 사용하기(@CookieValue, HttpServletResponse) (0) | 2020.12.01 |
댓글