java - 什么时候在 Spring 中使用 javax.inject.Provider?

标签 java spring dependency-injection provider

它的作用很简单:

@Inject
private Provider<ProductService> productService;

产品服务可通过 productService.get() 获得,.get() 将在每次调用时从 Spring 上下文中解析实例。

但是我应该什么时候使用它呢?在哪里?

我的主要用例非常简单:当我获得循环依赖项时,提供程序会在运行时帮助解决依赖项。但是,如果您只是在由于循环依赖而无法创建上下文时将其放入,它看起来有点随机。

关于 Providers 的使用是否有任何已知模式?

最佳答案

在 cdi 中,提供程序用于将范围更窄的对象注入(inject)范围更广的 bean,例如,如果 session 范围的 bean 需要访问请求范围的对象,它会注入(inject)一个提供程序,然后是一个正在运行的方法在请求中,调用 provider.get() 以获取对适当请求范围对象的局部变量引用。

鉴于以下情况:

@RequestScoped
public class Bean1 {
    void doSomething();
}

以下将使用与 session 中第一个请求关联的 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();
    }
}

关于java - 什么时候在 Spring 中使用 javax.inject.Provider?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16435117/

相关文章:

java - 返回 java.util.Map 的 java 方法在 openapi 中生成 String 返回而不是 Map

java - 确定哪些 Spring @Value 注解注入(inject)失败

java - 备用 Java GUI 框架

java - 如何全局保存一个变量 token 并每 10 小时更新一次

java - 获取对试图创建我的对象的引用

java - 如何在 Spring Boot 2 启动时运行自定义 ddl 脚本

java - 如何在HandlerInterceptor中读取请求体?

java - 如何在 Spring @ResponseBody 中使用 Jackson 将 ArrayList<String> 转换为 JSON 对象

scala - 如何使用 Play 2.4 将服务注入(inject)到 Actor 中?

jsf - 如何在多个类实现中使用 CDI 限定符?