我正在将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;
}
还有Service类,该类从仓库中调用getRegistrationGroups方法。
@Service
public class RegistrationService {
@Autowired
private Provider<RegistrationGroupRepository> registrationGroupRepository;
public List<RegistrationGroup> getRegistrationGroup() {
return registrationGroupRepository.getRegistrationGroups(1);
}
}
如果两个或多个请求执行getRegistrationGroups(1)方法,是否会出现竞争情况?
我猜我出于安全考虑,因为我将方法注入(提供者)与原型bean一起使用,并且每次从调用中获取新实例时?
最佳答案
首先,使您的Bean成为原型Bean并不能确保为每次方法调用(或每种用法,无论如何)都创建一个实例。
在您的情况下,由于Provider
的用法,您可以接受。
但是我注意到您正在直接访问getRegistrationGroups
。
return registrationGroupRepository.getRegistrationGroups(1);
该代码如何编译?您应该在
get()
实例上调用Provider
。return registrationGroupRepository.get().getRegistrationGroups(1);
回答您的问题,使用此代码应该很好。我不喜欢在
RegistrationGroupRepositoryImpl
中维护某种状态的事实,但这是您的选择。我总是喜欢将所有字段都设置为
final
。如果其中之一要求我删除final
修饰符,则说明设计存在问题。