假设我有以下内容:
@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中做到这一点,但是我怎么在这里做到呢?
答案 0 :(得分:1)
我将使用所有需要的bean创建地图。默认情况下,地图将是singleton
,地图将是unmodifiable
,以防止任何人错误地更改地图。如果您需要锤子作为弹跳豆,只需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);
}
}