Tar*_*ion 22 java provider spring dependency-injection
它的作用非常简单:
@Inject
private Provider<ProductService> productService;
Run Code Online (Sandbox Code Playgroud)
Product服务可通过productService.get()并.get()在每次调用时从Spring上下文中解析实例.
但什么时候应该使用它?在哪里?
我的主要用例非常简单:当我获得循环依赖时,提供程序有助于在运行时解决依赖关系.但是当你无法创建由循环依赖引起的上下文时,它会看起来有点随机.
是否有关于提供商使用的已知模式?
小智 26
在cdi中,提供者习惯于将范围较窄的对象注入到更广泛的bean中,例如,如果会话范围的bean需要访问请求范围对象,它会注入提供者,然后是在请求中运行的方法,调用provider.get()以获取对适当的请求范围对象的局部变量引用.
鉴于以下内容:
@RequestScoped
public class Bean1 {
void doSomething();
}
Run Code Online (Sandbox Code Playgroud)
以下将使用与会话中第一个请求关联的Bean1实例来使用Bean2,无论哪个请求正在调用Bean2.doSomething():
@SessionScoped
public class Bean2 {
@Inject Bean1 bean;
public void doSomething() {
bean.doSomething();
}
}
Run Code Online (Sandbox Code Playgroud)
以下将使用与当前调用Bean3.doSomething()的特定请求关联的Bean实例,即每个请求的不同bean:
@SessionScoped
public class Bean3 {
@Inject Provider<Bean1> bean;
public void doSomething() {
bean.get().doSomething();
}
}
Run Code Online (Sandbox Code Playgroud)
Jos*_*tin 21
此接口等效于org.springframework.beans.factory.ObjectFactory<T>通常用于BeanFactory.getBean()在查找原型实例时避免客户端代码中的调用.通常用来ObjectFactoryCreatingFactoryBean获取原型bean来源BeanFactory.
来自ObjectFactoryCreatingFactoryBeanjavadocs的示例:
<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>
Run Code Online (Sandbox Code Playgroud)
有了Providers,您可以使用ProviderCreatingFactoryBean.
解决相同问题的其他选项(使用继承而不是组合)是 查找方法注入
| 归档时间: |
|
| 查看次数: |
33517 次 |
| 最近记录: |