복붙노트

[SPRING] Spring에서 javax.inject.Provider를 사용해야 할 때?

SPRING

Spring에서 javax.inject.Provider를 사용해야 할 때?

그것이하는 일은 꽤 간단합니다 :

@Inject
private Provider<ProductService> productService;

Product 서비스는 productService.get ()을 통해 사용할 수 있으며 .get ()은 각 호출에서 Spring 컨텍스트의 인스턴스를 확인합니다.

그러나 언제 사용해야합니까? 그리고 어디?

필자의 주요 유스 케이스는 매우 간단하다 : 원형 의존성을 얻으면 공급자는 런타임에 종속성을 해결하는 데 도움을 준다. 그러나 원형 종속성으로 인해 컨텍스트를 만들 수없는 경우에만 던져 버리면 조금 임의적으로 보입니다.

제공자의 사용에 대해 알려진 패턴이 있습니까?

해결법

  1. ==============================

    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. ==============================

    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();
        }
    }
    
  3. from https://stackoverflow.com/questions/16435117/when-to-use-javax-inject-provider-in-spring by cc-by-sa and MIT license