簡體   English   中英

Spring 原型作用域 bean。 我需要將其中的字段設為threadLocal嗎?

[英]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;

}
  • 我需要將字段聲明為 ThreadLocal 嗎?
  • 我是否需要同步查找方法,因為 AFAIK Singleton 不是線程安全的?
  • 我需要在 PostOperator 中同步 submitEmail() 方法嗎?

非常感謝伙計們的澄清。

在我看來,只要從屬實例不包含任何影響的 state。

在上面的示例中,您的服務PostOperator依賴於MailSender ,它唯一的職責是根據給定的參數發送 email,其中所有行為都綁定到send方法,唯一的例外是 email 配置。因此,在這種情況下,基於 email 配置。正在使用的憑據send方法不依賴於任何其他 state 發送方法,它也沒有任何副作用,您不必擔心線程安全。

無狀態服務工作發現大多數情況下都具有線程安全性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM