java - 根据 Spring 中的输入返回 Singleton bean

标签 java spring singleton

假设我有以下内容:

@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/

相关文章:

java - Android USB 配件多线程

java - 从 OpenAPI 3 生成 Java Spring API

Java Spring框架-Bootstrap集成

C++ 单例设计模式

java - JPA级联持久化

java - 如何指定嵌入属性中的属性?

java - 初始化具有许多可选数据成员的类的 Java 最佳实践是什么?

spring - 如何使用 Spring 和 Tiles2 本地化页面标题?

java - java中Singleton的并发访问

dependency-injection - 依赖注入(inject)和/vs 全局单例