@Autowired в Spring 3.0 - создает статический компонент? - PullRequest
0 голосов
/ 10 декабря 2011

Я, должно быть, неправильно использую @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

Я бы подумал, что автоматическое подключение создаст копии компонента для каждого экземпляра класса контроллера. Но это не так. Что я не понимаю?

Ответы [ 2 ]

2 голосов
/ 10 декабря 2011

Весенние бобы имеют область действия "singleton" по умолчанию.Если вам нужны отдельные экземпляры, "prototype":

<bean class="com.marchon.orderentry.serviceimpls.ReleaseOrderServiceImpl"
      id="releaseOrderService"
      scope="prototype" />

То, что это автоматическое соединение, не имеет значения.

0 голосов
/ 10 декабря 2011

Spring bean по умолчанию являются синглетонами.Если вам нужно, чтобы ваш releaseOrderService отличался от одноэлементного, вам нужно соответствующим образом установить область действия компонента.см. Области применения бобов

...