我有一个具有以下配置的简单的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端点时,我看到了一些奇怪的行为。两次记录以下消息:“正在创建一个新消息。”
答案 0 :(得分:0)
您的bean具有原型作用域,这意味着每次您请求该bean时都会创建一个新实例。
官方解释:
bean部署的非单一原型范围导致 每次针对特定的请求创建一个新的bean实例 豆制成。也就是说,将Bean注入另一个Bean或您 通过容器上的getBean()方法调用来请求它。作为一个 规则,您应该对所有有状态Bean使用原型作用域,并且 无状态bean的单例作用域。
另一件事是值为proxyMode
的{{1}}。这意味着注入到 ProfitCalculatorService 的bean本身不是 BidAskPrice 本身,而是该bean的代理(使用CGLIB创建),并且该代理了解作用域并返回基于实例的实例。关于范围的要求(在您的情况下为原型)。
因此,我的建议是:您不需要创建TARGET_CLASS
的显式bean。由于HashMap<String, BidAskPrice>
是bean,因此您可以直接在服务中注入BidAskPrice
,Spring将为您管理此列表!