当前位置: 首页 > 知识库问答 >
问题:

Spring原型范围bean。我是否需要将其中的字段设置为threadLocal?

华修永
2023-03-14

Spring框架中有一条经验法则——将无状态bean声明为单例,将有状态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控制器

@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

非常感谢各位的澄清。

共有1个答案

凌炜
2023-03-14

在我看来,只要依赖实例不包含任何影响的状态。

在上面的示例中,您的服务取决于邮件发送者,它的唯一责任是根据给定的参数发送电子邮件,其中所有行为都绑定到发送方法。唯一的例外是电子邮件配置。因此,在这种情况下,基于所使用的电子邮件凭据,send方法不依赖于任何其他状态来发送方法,而且它也没有任何副作用,您不必担心线程安全。

无状态服务可以找到大多数线程安全的情况。

 类似资料:
  • 我决定为Android制作最低API版本21,但这是否意味着不再使用AppCompat了?只是使用普通的材料设计/没有AppCompat/等?

  • 我正在使用 Spring 3.1.1,在我的业务逻辑中,我有一个循环,每次迭代都需要一个新的 Spring bean(原型范围)实例。 最好的方法是什么?我是否必须创建自己的 BeanFactory 类,我可以将其注入一次到我的类中,并且每次都调用它来生成 bean?在查看 Spring 3 文档时,它似乎暗示我应该改用 ApplicationContext。但是,使用ApplicationCon

  • 我是一名spring boot学习者,所以我一直在尝试创建一些基本的spring boot应用程序。我试图运行开发的应用程序时出错。 我的错误是[[https://i.stack.imgur.com/oyQDi.png][1]][1] java: ItemDetails.java:[软件包名称:io.ajithan.springbootstarter.model] ItemResponse.jav

  • 结构没有问题。spring boot可以扫描UserMapper,但不能扫描UserService。我试着给我的UserService@Mapper组件,然后它就可以被扫描了。但我不知道如何使用其他方法进行扫描。我尝试了@服务,但不起作用。

  • 问题内容: 有人可以解释一下我一直只使用“原型”的Spring bean的作用域吗,但是还有其他参数可以代替吗? 我在说什么的例子 问题答案: 从Spring规范开始,支持五种类型的bean作用域: 1.单身人士(默认*) 每个Spring IoC容器将单个bean定义的作用域限定为单个对象实例。 2.原型 将单个bean定义的作用域限定为任意数量的对象实例。 3.要求 将单个bean定义的范围限