Я, должно быть, неправильно использую @Autowired, но не понимаю, как именно. Это приложение Spring 3.0 Portal MVC.
Сами сервисы не основаны на пружине (они генерируются автоматически). Вокруг сервиса написано упоминание о некоторых пользовательских функциях - эти классы имеют автоматическую проводку.
Проблема, с которой я столкнулся, заключается в том, что мой класс autowired выглядит внутренне как статический. И, следовательно, этот код не является потокобезопасным.
Класс контроллера:
@Controller
@RequestMapping("VIEW")
@SessionAttributes(value={"shoppingCartCommonBean"})
public class ShoppingCartAndOrderScreenHandler
{
@Autowired
AbstractServiceImpl releaseOrderService;
. . .
@ActionMapping(value = "SubmitOrder")
public void submitOrder(Model model, PortletRequest request) {
try {
ReleaseOrderContract contract = new ReleaseOrderContract();
/* Initialize contract values from request */
releaseOrderService.setServiceRequest(contract);
logger.debug("ReleaseOrderImpl Hash: " +
releaseOrderService.hashCode());
releaseOrderService.invoke();
}
. . . .
}
}
Где автопроводка объявлена в springconfig.xml как
<beans xmlns="http://www.springframework.org/schema/beans" . . . >
<context:component-scan
base-package="com.marchon.orderentry.shoppingcartandorder.requesthandler" />
. . . .
<bean class="com.marchon.orderentry.serviceimpls.ReleaseOrderServiceImpl"
id="releaseOrderService" />
. . . .
</beans>
Я видел подозрительное поведение при большой нагрузке, когда несколько потоков одновременно выполняют один и тот же impl, они не поддерживают согласованные контракты (что, конечно, является нестатической переменной класса в impl службы). И, конечно же, когда я распечатываю hashmap для impl, я получаю идентичные hashmaps - идентичные объекты.
[ebContainer : 1] [ShoppingCartAndOrderScreenHandler . 208] DEBUG - ReleaseOrderImpl Hash: 1385321106
[ebContainer : 3] [ShoppingCartAndOrderScreenHandler . 208] DEBUG - ReleaseOrderImpl Hash: 1385321106
[ebContainer : 0] [ShoppingCartAndOrderScreenHandler . 208] DEBUG - ReleaseOrderImpl Hash: 1385321106
Я бы подумал, что автоматическое подключение создаст копии компонента для каждого экземпляра класса контроллера. Но это не так. Что я не понимаю?