我有一个使用struts2.2和spring 3.1的应用程序,我想禁用spring autowire。
我google了一下,发现我必须放在<beans>
标签default-autowire="no"
,但这似乎不起作用。
然后我知道我可以为每个<bean>
标记声明这个:<bean autowire="no">
,但这似乎也不起作用。
当我启用spring debug logger时,我可以看到很多这样的消息:
INFO:DEBUG [http-thread-pool-8080(3)](ConstructorResolver.java:739) - 按类型从bean名称'com.common.actions.PopupAction'通过构造函数自动装配到名为'intermedService'的bean < / p>
,applicationConfig.xml中的相应条目是:
<beans default-autowire="no"
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
<bean id="PopupAction" scope="prototype" class="com.common.actions.PopupAction" autowire="no">
<constructor-arg type="com.common.services.abs.iIntermedService" ref="intermedService"/>
<constructor-arg type="com.common.services.abs.iLocationService" ref="locationService"/>
<constructor-arg type="com.common.services.abs.iUserService" ref="userService"/>
<constructor-arg type="com.common.services.abs.iPhoneService" ref="phoneService"/>
</bean>
为什么只要我在这里手动定义依赖关系并定义auto-wire="no"
,春天会尝试自动执行此操作?
或者这条消息告诉我接线是通过类型通过构造函数(我想要的)和“按类型自动装配”意味着从4个参数中他将mediumService与我的变量中间服务匹配(而不是按顺序或别的什么)?
答案 0 :(得分:5)
Struts 2 Spring插件默认将自动装配设置为“名称”。目前我不相信插件允许“无”作为值,但你可以尝试使用“自动” - 我怀疑这无济于事,因为它仍然是一个自动装配豆工厂。
之前提到过;我不记得任何真正的决议。我再次提起它,看看它是否可以在我们进行一些重要清理的下一个版本中解决。
编辑还有struts.objectFactory.spring.autoWire.alwaysRespect
常量,默认为false
;尝试将其设置为true
。我不记得布尔意味着哪种意义,或者它是否具有效果 - 现在正在研究它。
答案 1 :(得分:1)
一种绕过它的方法(直到它被修复)只是命名你的字段/构造函数参数和你的bean不同,所以spring不能匹配它们。
答案 2 :(得分:0)
我相信default-autowire =“no”默认启用。即,如果您未指定default-autowire,则表示default-autowire =“no”。如果您不希望这个bean被自动装配,请尝试设置autowire-candidate =“false”http://static.springsource.org/spring/docs/2.5.x/reference/beans.html