repo类线程对并发请求是否安全? -春季靴

时间:2019-02-17 18:20:53

标签: java spring-boot spring-mvc

我正在将Spring boot与jetty嵌入式Web服务器一起用于一个Web应用程序。 我想100%确保repo类是线程安全的。

回购类

@Repository
@Scope("prototype")
public class RegistrationGroupRepositoryImpl implements RegistrationGroupRepository {

  private RegistrationGroup rg = null;
  Integer sLastregistrationTypeID = 0;
  private UserAccountRegistration uar = null;
  private List<RegistrationGroup> registrationGroup = new ArrayList<>();

  private NamedParameterJdbcTemplate jdbcTemplate;


  @Autowired
  public RegistrationGroupRepositoryImpl(DataSource dataSource) {
     this.jdbcTemplate = new NamedParameterJdbcTemplate(dataSource);
  }

  public List<RegistrationGroup> getRegistrationGroups(Integer regId) {
    // Some logic here which is stored in stored in the instance variables and registrationGroup is returned from the method

   return this.registrationGroup;
  }

还有从存储库中调用getRegistrationGroups方法的Service类。

@Service
public class RegistrationService {

  @Autowired
  private Provider<RegistrationGroupRepository> registrationGroupRepository;

  public List<RegistrationGroup> getRegistrationGroup() {
     return registrationGroupRepository.getRegistrationGroups(1);
  }

}

如果两个或多个请求执行getRegistrationGroups(1)方法,是否可以出现竞争情况? 我想我是出于安全考虑,因为我将方法注入(提供者)与原型bean一起使用,并且每次从调用中获取新实例时都如此?

1 个答案:

答案 0 :(得分:1)

首先,使您的Bean成为 prototype 原型Bean不能确保为每次方法调用(或每种用法,无论使用何种方法)都创建一个实例。

在这种情况下,您可以接受Provider的使用。
但是,我注意到您正在直接访问getRegistrationGroups

return registrationGroupRepository.getRegistrationGroups(1);

该代码如何编译?您应该在get()实例上调用Provider

return registrationGroupRepository.get().getRegistrationGroups(1);

回答您的问题,使用此代码应该很好。我不喜欢您在RegistrationGroupRepositoryImpl内部维护某种状态的事实,但这是您的选择。

我总是喜欢将所有字段都设为final。如果其中之一要求我删除final修饰符,则说明设计有问题。