春季两次创建原型bean?

时间:2019-12-08 17:08:15

标签: java spring

我有一个具有以下配置的简单的Spring Boot应用程序:

@Configuration
public class MyConfig {
    @Bean
    @Scope(value = "prototype", proxyMode = ScopedProxyMode.TARGET_CLASS)
    public HashMap<String, BidAskPrice> beanyBoi() {
        System.out.println("creating a new one");
        return dataFetcher().getPairPricesBidAsk();
    }
}

我有服务

@Service
public class ProfitCalculatorService {

  @Autowired
  private HashMap<String, BidAskPrice> prices;

  public HashMap<String, BidAskPrice> getPrices() {
    return prices;
  }
}

我有一个控制器

@RestController
public class TestController {

  @Autowired
  ProfitCalculatorService profitCalculatorService;

  @GetMapping("/getprices")
    public HashMap<String, BidAskPrice> someprices() {
      return profitCalculatorService.getPrices();
    }
  }
}

现在当我到达/ getprices端点时,我看到了一些奇怪的行为。两次记录以下消息:“正在创建一个新消息。”

1 个答案:

答案 0 :(得分:0)

您的bean具有原型作用域,这意味着每次您请求该bean时都会创建一个新实例。

官方解释:

  

bean部署的非单一原型范围导致   每次针对特定的请求创建一个新的bean实例   豆制成。也就是说,将Bean注入另一个Bean或您   通过容器上的getBean()方法调用来请求它。作为一个   规则,您应该对所有有状态Bean使用原型作用域,并且   无状态bean的单例作用域。

https://docs.spring.io/spring/docs/current/spring-framework-reference/core.html#beans-factory-scopes-prototype

另一件事是值为proxyMode的{​​{1}}。这意味着注入到 ProfitCalculatorService 的bean本身不是 BidAskPrice 本身,而是该bean的代理(使用CGLIB创建),并且该代理了解作用域并返回基于实例的实例。关于范围的要求(在您的情况下为原型)。

因此,我的建议是:您不需要创建TARGET_CLASS的显式bean。由于HashMap<String, BidAskPrice>是bean,因此您可以直接在服务中注入BidAskPrice,Spring将为您管理此列表!

相关问题