我正在为一个 Web 应用程序使用带有 jetty 嵌入式 Web 服务器的 Spring Boot。我想 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; }以及从 repo 调用 getRegistrationGroups 方法的 Service 类。@Servicepublic class RegistrationService { @Autowired private Provider<RegistrationGroupRepository> registrationGroupRepository; public List<RegistrationGroup> getRegistrationGroup() { return registrationGroupRepository.getRegistrationGroups(1); }}如果两个或多个请求执行 getRegistrationGroups(1) 方法,我会出现竞争情况吗?我想我是在安全方面,因为我正在使用带有原型 bean 的方法注入(提供程序),并且每次我从调用中获取新实例时?
1 回答
慕码人2483693
TA贡献1860条经验 获得超9个赞
首先,使您的 Bean 成为原型Bean 并不能确保为每个方法调用(或每次使用,等等)创建一个实例。
在您的情况下,由于使用情况,您在这一点上没问题Provider
。
但是,我注意到您正在getRegistrationGroups
直接访问。
return registrationGroupRepository.getRegistrationGroups(1);
这段代码如何编译?您应该调用实例get()
。Provider
return registrationGroupRepository.get().getRegistrationGroups(1);
回答您的问题,您应该很好地使用此代码。我不喜欢你在内部保持某种状态的事实RegistrationGroupRepositoryImpl
,但这是你的选择。
我总是喜欢将我的所有领域都作为final
. 如果其中一个要求我删除final
修饰符,则说明设计有问题。
添加回答
举报
0/150
提交
取消