首页 > 解决方案 > 根据 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 中做到这一点,但我怎么能在这里做到呢?

标签: javaspringsingleton

解决方案


我会用所有需要的豆子创建地图。地图将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);
    }
}

推荐阅读