injection - ¿Cuándo usar javax.inject.Provider en Spring?
spring dependency injection application context (2)
Lo que hace es bastante simple:
@Inject
private Provider<ProductService> productService;
El servicio del Producto está disponible a través de productService.get()
y .get()
resolverá la instancia del contexto de Spring en cada llamada.
Pero cuando debo usarlo? ¿Y donde?
Mi caso de uso principal es bastante simple: cuando obtengo dependencias circulares, el proveedor ayuda a resolver la dependencia en tiempo de ejecución. Pero parece un poco aleatorio si lo lanza justo cuando no puede crear su contexto causado por una dependencia circular.
¿Existen patrones conocidos sobre el uso de los proveedores?
En cdi, los proveedores se utilizan para inyectar objetos de alcance más estrecho en un bean de ámbito más amplio, por ejemplo, si un bean de ámbito de sesión necesita acceso a un objeto de ámbito de solicitud, inyecta un proveedor y luego un método que se ejecuta en una solicitud. , llama a provider.get()
para obtener una referencia de variable local al objeto de ámbito de solicitud apropiado.
Dado lo siguiente:
@RequestScoped
public class Bean1 {
void doSomething();
}
Lo siguiente usará la instancia de Bean1 asociada con la primera solicitud en la sesión para usar Bean2 independientemente de qué solicitud esté llamando a Bean2.doSomething ():
@SessionScoped
public class Bean2 {
@Inject Bean1 bean;
public void doSomething() {
bean.doSomething();
}
}
Lo siguiente usará la instancia de Bean asociada con la solicitud particular que actualmente está llamando Bean3.doSomething (), es decir, un bean diferente para cada solicitud:
@SessionScoped
public class Bean3 {
@Inject Provider<Bean1> bean;
public void doSomething() {
bean.get().doSomething();
}
}
Esta interfaz es equivalente a org.springframework.beans.factory.ObjectFactory<T>
que se usa normalmente para evitar las llamadas BeanFactory.getBean()
en el código del cliente cuando se buscan instancias de prototipo. A menudo se utiliza con ObjectFactoryCreatingFactoryBean
para obtener prototipos de beans de BeanFactory
.
Ejemplo de 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>
Con los Providers
, puede utilizar el ProviderCreatingFactoryBean
lugar.
Otra opción para resolver el mismo problema, (usando la herencia en lugar de la composición) es la inyección del método de búsqueda