首页 > 解决方案 > 当我想在集合中保存多个 bean 时,是否需要在 Spring 中同步 @Autowired 方法?

问题描述

假设我在项目中有基于 Spring 框架的下一个类:

interface I {
    String getName()
}

@Component
class I1 implements I {
    @Override
    String getName() {return "I1"}
}

@Component
class I2 implements I {
    @Override
    String getName() {return "I1"}
}

我想使用以下@Autowired方法将它们全部收集在地图中:

@Component
public class A {
    private Map<I> map = new HashMap<>()

    @Autowired
    public registerI(I i) {
        map.put(i.getName(), i)
    }
}

我应该让这个方法registerI同步吗?我的意思是,Spring 可以同时在多个线程中调用此方法吗?或者这个方法会被顺序调用?

谢谢

标签: javaspringspring-bootdependency-injection

解决方案


您不必使用synchronized,因为 Spring bean 初始化是单线程和线程安全的。你可以想到像线程范围或惰性 bean 这样的陷阱,但是对于常规的单例 bean,初始化发生在一个线程中。

您可能希望使用synchronized确保在registerI()调用方法之后您的对象是安全发布的,尽管带有字段的自动连接构造函数final更具可读性。

@Component
public class A {
    private final Map<String, I> map;

    public A(List<I> list) {
        map = list.stream().collect(Collectors.toMap(I::getName, i -> i));
    }

}

推荐阅读