[英]Spring Prototype scoped bean. Do I need to make fields in it as threadLocal?
Spring 框架中有一條經驗法則 - 將無狀態 bean 聲明為 singleton 並作為原型聲明有狀態。 但是,沒有關於原型作用域 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);
}
}
我有一個帶有查找方法的 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;
}
非常感謝伙計們的澄清。
在我看來,只要從屬實例不包含任何影響的 state。
在上面的示例中,您的服務PostOperator
依賴於MailSender
,它唯一的職責是根據給定的參數發送 email,其中所有行為都綁定到send
方法,唯一的例外是 email 配置。因此,在這種情況下,基於 email 配置。正在使用的憑據send
方法不依賴於任何其他 state 發送方法,它也沒有任何副作用,您不必擔心線程安全。
無狀態服務工作發現大多數情況下都具有線程安全性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.