【发布时间】:2021-05-23 17:50:53
【问题描述】:
Spring Framework 中有一条经验法则——将无状态 bean 声明为单例,声明为原型。但是,没有关于原型作用域 bean 中的状态字段的信息,也没有关于是否应该同步查找方法以避免竞争条件的信息?
假设我有一个有多个字段的有状态 bean
@Service
@Scope("prototype")
class PostOperator {
@Autowired
private MailSender mailSender;
private String lastName;
private String streetAddress;
private Long operatorId;
private Map <String, String> subjectArticle map;
public PostOperator(String lastName, String streetAddress, Long operatorId,
Map <String, String> subjectArticle map){
......
}
public void submitEmail(){
mailSender.send(lastName, streetAddress, operatorId);
}
}
我有一个带有 Lookup 方法的 Rest Controller
@RestController
class AppointmentController {
@GetMapping("/submit")
public ResponseEntity submit() {
PostOperator operator = getOperator("Smith", "Fleet Str.", 7L,
new ConcurrentHashMap<>());
operator.submitEmail();
return ResponseEntity.ok();
}
@Lookup
public PostOperator getOperator(String lastName, String streetAddress, Long operatorId,
Map <String, String> subjectArticle map) {
return null;
}
- 我需要将字段声明为 ThreadLocal 吗?
- 我是否需要同步查找方法,因为 AFAIK Singleton 不是线程安全的?
- 是否需要在 PostOperator 中同步 submitEmail() 方法?
非常感谢大家的澄清。
【问题讨论】:
标签: java spring spring-mvc prototype synchronized