Вопрос: p>
- Область использования EmployeeManager не указана, поэтому я предполагаю, что областью по умолчанию является SINGLETON, а bean-компоненты Spring не являются потокобезопасными. Верно ли это предположение?
- Сотрудник Manager — это часть сервлета, к которой могут обращаться несколько потоков.
Предположим, метод «delete» вызывается несколькими потоки одновременно со значениями «1», «2» и «3», и для каждого потока (начиная с его SINGLETON) генерируется один и тот же экземпляр EmployeeManager, значение удаления которого будет выполнено. Как Spring обрабатывает это условие?
@Controller
public class EditEmployeeController
{
@Autowired
private EmployeeManager employeeManager;
@RequestMapping(value = "/", method = RequestMethod.GET)
public String listEmployees(ModelMap map)
{
map.addAttribute("employee", new EmployeeEntity());
map.addAttribute("employeeList", employeeManager.getAllEmployees());
return "editEmployeeList";
}
@RequestMapping(value = "/add", method = RequestMethod.POST)
public String addEmployee(@ModelAttribute(value="employee") EmployeeEntity employee, BindingResult result)
{
employeeManager.addEmployee(employee);
return "redirect:/";
}
@RequestMapping("/delete/{employeeId}")
public String deleteEmplyee(@PathVariable("employeeId") Integer employeeId)
{
employeeManager.deleteEmployee(employeeId);
return "redirect:/";
}
public void setEmployeeManager(EmployeeManager employeeManager) {
this.employeeManager = employeeManager;
}
}
public interface EmployeeManager {
public void addEmployee(EmployeeEntity employee);
public List getAllEmployees();
public void deleteEmployee(Integer employeeId);
}
@Service
public class EmployeeManagerImpl implements EmployeeManager
{
@Autowired
private EmployeeDAO employeeDAO;
@Override
@Transactional
public void addEmployee(EmployeeEntity employee) {
employeeDAO.addEmployee(employee);
}
@Override
@Transactional
public List getAllEmployees() {
return employeeDAO.getAllEmployees();
}
@Override
@Transactional
public void deleteEmployee(Integer employeeId) {
employeeDAO.deleteEmployee(employeeId);
}
public void setEmployeeDAO(EmployeeDAO employeeDAO) {
this.employeeDAO = employeeDAO;
}
}
Подробнее здесь: https://stackoverflow.com/questions/270 ... ead-safety
Мобильная версия