ObjectFactory와 ObjectProvider가 있는데 ObjectProvider가 ObjectFactory를 상속 받고 있고
ObjectProvider가 기능이 더 많아서 이걸 사용한다.
사용법
@Autowired
private ObjectProvider<PrototypeBean> prototypeBeanProvider;
public int logic() {
PrototypeBean prototypeBean = prototypeBeanProvider.getObject();
prototypeBean.addCount();
int count = prototypeBean.getCount();
return count;
ObjectProvider객체로 getObject()를 해주면 항상 새로운 프로토타입 빈이 생성된다.
ObjectProvider의 getObject()를 호출 하면 내부에서 스프링 컨테이너를 통해 해당 빈을 찾아서 반환한다.
이런걸 Dependency Lookup(DL)이라고 한다. (외부에서 주입(DI) 받는게 아니라 직접 필요한 의존관계를 찾는것을 DL이라고 한다.)
ObjectFactory,ObjectProvider는 스프링에 의존한다. 라이브러리가 필요없다.
JSR-330 Provider이라는 자바 표준을 사용하는 방법이다.
이건 라이브러리가 필요하다.
javax.inject:javax.inject:1
이걸 gradle에 추가 해야한다.
사용법
//implementation 'javax.inject:javax.inject:1' gradle 추가 필수
@Autowired
private Provider<PrototypeBean> provider;
public int logic() {
PrototypeBean prototypeBean = provider.get();
prototypeBean.addCount();
int count = prototypeBean.getCount();
return count;
}
이것도 비슷하게 동작한다.
다른점이라면 라이브러리를 추가하는것과 get()메소드를 쓰는것, 자바표준이고 기능이 단순해서 단위테스트를 만들거나 mock 코드를 만들기는 훨씬 쉬워진다.
Provider는 지금 딱 필요한 DL정도의 기능만 제공한다.
이건 스프링에 의존하지 않기 때문에 스프링이 아닌 다른 컨테이너에서도 사용이 가능하다.
정리
그러면 프로토타입 빈을 언제 사용할까? 매번 사용할 때 마다 의존관계 주입이 완료된 새로운 객체가 필요하 면 사용하면 된다. 그런데 실무에서 웹 애플리케이션을 개발해보면, 싱글톤 빈으로 대부분의 문제를 해결할 수 있기 때문에 프로토타입 빈을 직접적으로 사용하는 일은 매우 드물다.
ObjectProvider , JSR330 Provider 등은 프로토타입 뿐만 아니라 DL이 필요한 경우는 언제든지 사용 할 수 있다.
'개인공부' 카테고리의 다른 글
mySql 데이터 삭제법 (0) | 2021.11.14 |
---|---|
RequestScope (0) | 2021.11.11 |
Token 사용이유 (0) | 2021.11.08 |
생성자 주입으로 불변하게 설계한다. (0) | 2021.11.03 |
@ComponentScan (0) | 2021.11.02 |