我必须使用@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的副本。但事实并非如此。我不理解的是什么?
答案 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