假设我有以下内容:
@Component
@NoArgsConstructor
public class ToolFactory {
public Tool getTool(String type) {
return StaticToolProvider.getTool(type);
}
}
这个类将被注入(inject)到其他地方并像这样调用:
工具 Screwdriver = ToolFactory.getTool(" Screwdriver ")
如果工具可以是 Screwdriver 、锤子或 Spanner ,我希望 Spring 为每个工具创建 Singleton bean,并在调用 getTool()
时返回它们。我相信 @Provides @Singleton
会在 Guice 中执行此操作,但我如何在这里执行此操作?
最佳答案
我将使用所有需要的 bean 创建 map 。默认情况下, map 将是单例
并且不可修改
以防止任何人错误地更改它。如果您需要 Hammer 成为 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);
}
}
关于java - 根据 Spring 中的输入返回 Singleton bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51582948/