java - 当我想在集合中保存多个 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 可以同时在多个线程中调用此方法吗?或者这个方法会被顺序调用?
谢谢
解决方案
您不必使用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));
}
}
推荐阅读
- python - Remove repeated header lines from a txt file but keep the first header row
- java - 从 ImageResource 中的字符串设置图像
- kubernetes - 节点冻结排水
- elasticsearch - Elasticsearch 集群被冻结任务阻塞
- kotlin - 如何使用 Koin 创建具有运行时依赖项的实例?
- javascript - Apollo 不可分配给“VueClass”类型的参数
- asp.net - POST receives unknown parameter name
- javascript - 在访问 node/express 中的数据库之前,函数总是返回 false
- android - 从已知内存地址读取值的应用程序
- r - 有效评估多元正态