根据Spring中的输入返回Singleton bean

时间:2018-07-29 17:43:03

标签: java spring singleton

假设我有以下内容:

@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中做到这一点,但是我怎么在这里做到呢?

1 个答案:

答案 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);
    }
}