Для веб-приложения MVC Spring @Transactional должен идти на контроллере или сервисе?
Для WebApplicationContext я должен поставить@Transactional
аннотации в контроллере или в сервисах? Весенние документы меня немного смущают.
Вот мой web.xml:
Alpha v0.02
spring
org.springframework.web.servlet.DispatcherServlet
1
spring
*.htm
spring
*.json
index.jsp
Вот мой application-context.xml, определяющий весенний сервлет-диспетчер:
Вот'Сервисный интерфейс:
public interface LayerService {
public void createLayer(Integer layerListID, Layer layer);
}
Вот's реализация сервиса:
@Service
public class LayerServiceImpl implements LayerService {
@Autowired
public LayerDAO layerDAO;
@Transactional
@Override
public void createLayer(Integer layerListID, Layer layer) {
layerDAO.createLayer(layerListID, layer);
}
}
И здесь's мой контроллер:
@Controller
public class MainController {
@Autowired
private LayerService layerService;
@RequestMapping(value = "/addLayer.json", method = RequestMethod.POST)
public @ResponseBody
LayerListSetGroup addLayer(@RequestBody JSONLayerFactory request) {
layerService.createLayer(request.getListId(), request.buildLayer());
return layerService.readLayerListSetGroup(llsgID);
}
}
Документация Spring меня немного смутила. Кажется, это указывает на то, что использование WebApplicationContext означает, что для аннотаций @Transactional будут проверяться только контроллеры, а не сервисы. Между тем я вижу множество рекомендаций сделать сервисы транзакционными, а не контроллерами. Я'Я думаю, что с помощью в нашем spring-servlet.xml выше, так как он включает пакеты служб, означает, что службы являются частью контекста и, следовательно, будут "расследованы» для транзакционных аннотаций. Это точно?
Вот'С рекламной информацией Spring, которая запутала меня:
@EnableTransactionManagement и ищет @Transactional только для bean-компонентов в том же контексте приложения, в котором они определены. Это означает, что если вы помещаете управляемую аннотацией конфигурацию в WebApplicationContext для DispatcherServlet, она проверяет только бины @Transactional в ваших контроллерах, а не ваши услуги.
Кроме того, есть ли какие-либо последствия для производительности или "вредность» если я определяю метод контроллера как транзакционный, и он вызывает транзакционный метод в другом классе? Моя догадка - нет, основываясь на документации, но я бы с удовольствием проверил это.