在 cdi 中,提供者用于将范围更窄的对象注入范围更广的 bean,例如,如果会话范围的 bean 需要访问请求范围的对象,它会注入提供者,然后注入在请求中运行的方法, 调用provider.get()
以获取对适当请求范围对象的局部变量引用。
鉴于以下情况:
@RequestScoped
public class Bean1 {
void doSomething();
}
以下将使用与会话中第一个请求关联的 Bean1 实例来使用 Bean2,而不管哪个请求正在调用 Bean2.doSomething():
@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();
}
}