[SPRING] Spring에서 javax.inject.Provider를 사용해야 할 때?
SPRINGSpring에서 javax.inject.Provider를 사용해야 할 때?
그것이하는 일은 꽤 간단합니다 :
@Inject
private Provider<ProductService> productService;
Product 서비스는 productService.get ()을 통해 사용할 수 있으며 .get ()은 각 호출에서 Spring 컨텍스트의 인스턴스를 확인합니다.
그러나 언제 사용해야합니까? 그리고 어디?
필자의 주요 유스 케이스는 매우 간단하다 : 원형 의존성을 얻으면 공급자는 런타임에 종속성을 해결하는 데 도움을 준다. 그러나 원형 종속성으로 인해 컨텍스트를 만들 수없는 경우에만 던져 버리면 조금 임의적으로 보입니다.
제공자의 사용에 대해 알려진 패턴이 있습니까?
해결법
-
==============================
1.이 인터페이스는 프로토 타입 인스턴스를 찾을 때 클라이언트 코드에서 BeanFactory.getBean () 호출을 피하기 위해 일반적으로 사용되는 org.springframework.beans.factory.ObjectFactory
와 같습니다. ObjectFactoryCreatingFactoryBean과 함께 사용되어 BeanFactory가 소스로하는 프로토 타입 bean을 얻습니다. 이 인터페이스는 프로토 타입 인스턴스를 찾을 때 클라이언트 코드에서 BeanFactory.getBean () 호출을 피하기 위해 일반적으로 사용되는 org.springframework.beans.factory.ObjectFactory
와 같습니다. ObjectFactoryCreatingFactoryBean과 함께 사용되어 BeanFactory가 소스로하는 프로토 타입 bean을 얻습니다. ObjectFactoryCreatingFactoryBean의 예제 javadocs :
<beans> <!-- Prototype bean since we have state --> <bean id="myService" class="a.b.c.MyService" scope="prototype"/> <bean id="myServiceFactory" class="org.springframework.beans.factory.config.ObjectFactoryCreatingFactoryBean"> <property name="targetBeanName"><idref local="myService"/></property> </bean> <bean id="clientBean" class="a.b.c.MyClientBean"> <property name="myServiceFactory" ref="myServiceFactory"/> </bean> </beans>
공급자를 사용하면 대신 ProviderCreatingFactoryBean을 사용할 수 있습니다.
다른 옵션은 동일한 문제를 해결하기 위해 (대신 합성을 사용하여 상속) 룩업 메소드 삽입
-
==============================
2.cdi에서 Providers는보다 좁은 범위의 객체를보다 광범위하게 범위가 지정된 bean에 삽입하는 데 사용됩니다. 예를 들어, 세션 범위의 bean이 요청 범위 객체에 대한 액세스를 필요로하는 경우 공급자를 주입 한 다음 요청에서 실행중인 메소드 적절한 request-scoped 객체에 대한 지역 변수 참조를 얻기 위해 provider.get ()을 호출합니다.
cdi에서 Providers는보다 좁은 범위의 객체를보다 광범위하게 범위가 지정된 bean에 삽입하는 데 사용됩니다. 예를 들어, 세션 범위의 bean이 요청 범위 객체에 대한 액세스를 필요로하는 경우 공급자를 주입 한 다음 요청에서 실행중인 메소드 적절한 request-scoped 객체에 대한 지역 변수 참조를 얻기 위해 provider.get ()을 호출합니다.
다음을 감안할 때 :
@RequestScoped public class Bean1 { void doSomething(); }
다음은 Bean2.doSomething ()을 호출하는 요청에 관계없이 세션의 첫 번째 요청과 관련된 Bean1 인스턴스를 사용하여 Bean2를 사용합니다.
@SessionScoped public class Bean2 { @Inject Bean1 bean; public void doSomething() { bean.doSomething(); } }
다음은 현재 Bean3.doSomething ()을 호출하고있는 특정 요청과 연관된 Bean의 인스턴스, 즉 각 요청에 대해 다른 Bean을 사용합니다.
@SessionScoped public class Bean3 { @Inject Provider<Bean1> bean; public void doSomething() { bean.get().doSomething(); } }
from https://stackoverflow.com/questions/16435117/when-to-use-javax-inject-provider-in-spring by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] spring.profiles.active가 설정 한 여러 개의 Spring 환경 프로파일이있는 경우 우선 순위는 무엇입니까? (0) | 2019.03.13 |
---|---|
[SPRING] Spring Security의 username-password grant에서 새로 고침 토큰을 사용하여 새 액세스 토큰 요청 OAuth2 (0) | 2019.03.13 |
[SPRING] Spring 데이터로 읽기 전용 저장소 만들기 (0) | 2019.03.13 |
[SPRING] DELETE 요청 본문에 데이터 전달 (0) | 2019.03.13 |
[SPRING] Spring Rest 서비스와 Jersey Rest Service 및 Spring + Jersey 솔루션의 차이점은 무엇입니까? (0) | 2019.03.13 |