java - 根据 Spring 中的输入返回 Singleton bean
问题描述
假设我有以下内容:
@Component
@NoArgsConstructor
public class ToolFactory {
public Tool getTool(String type) {
return StaticToolProvider.getTool(type);
}
}
此类将在其他地方注入并像这样调用:
Tool screwdriver = ToolFactory.getTool("screwdriver")
如果工具可以是螺丝刀、锤子或扳手,我希望 Spring 为每个工具创建 Singleton bean,并在getTool()
调用时返回它们。我相信@Provides @Singleton
会在 Guice 中做到这一点,但我怎么能在这里做到呢?
解决方案
我会用所有需要的豆子创建地图。地图将singleton
默认设置,unmodifiable
以防止任何人错误地更改它。如果您需要锤子成为spring bean autowire
,如果没有,您可以使用常规对象创建new
@Configuration
class Config {
@Bean
Map<String, Tool> tools(Hammer hammer) {
Map<String, Tool> map = new HashMap<>();
map.put("hammer", hammer);
//map.put("hammer",new Hammer())
return Collections.unmodifiableMap(map);
}
}
@Component
public class Container {
private Map<String, Tool> tools;
@Autowired
public Container(Map<String, Tool> tools) {
this.tools = tools;
}
Tool getTool(String tool) {
return tools.get(tool);
}
}
推荐阅读
- arrays - 如何使用 qsort 对结构指针数组进行排序
- node.js - React 中的多个显示器(物理监视器屏幕)
- c++ - 在 Qt 中重构 if-else
- java - 如何使用 selenium 在 Chrome 版本 90.0.4430.93 上允许相机访问
- user-interface - 动画不适用于 After Effects 中的合成内部合成
- python - 遍历 JSON 并附加到数据框中
- vb.net - 在 vb.net 中乘以 2 百分比的价格和利润
- python-3.x - 如何隐藏“CombinedMultiDict([ImmutableMultiDict([]),ImmutableMultiDict([(”)python3烧瓶
- react-router - 具有下一个导出模式的动态路由
- java - 为什么我的图形叠加层没有出现在输入图像上?