@Autowired在Spring 3.0中 - 创建一个静态bean?

时间:2011-12-09 22:41:52

标签: spring autowired

我必须使用@Autowired错误,但我不知道如何。这是一个Spring 3.0 Portal MVC应用程序。

服务本身不是基于弹簧的(它们是自动生成的)。在服务周围写了一个impl,提供了一些自定义功能 - 这些类是自动连接的。

我遇到的问题是我的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中的非静态类变量)。当然,当我打印出impl的hashmap时,我会得到相同的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

我原以为自动连接会为控制器类的每个实例创建bean的副本。但事实并非如此。我不理解的是什么?

2 个答案:

答案 0 :(得分:2)

Spring beans are "singleton" scope by default. If you need individual instances, "prototype"

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

它的自动连线无关紧要。

答案 1 :(得分:0)

春豆是默认的单身人士。如果您需要releaseOrderService不是单例,则需要适当地设置bean范围。见Bean Scopes