我是Spring的新手并试图让事情顺利进行。我想使用基于xml setter的依赖注入,并避免在Java中使用'@whatever'标记。
我正在使用带有Spring 3.1.1的NetBeans 7,我在项目中也有一些Struts 2代码可以正常工作。
我遇到的问题是依赖注入似乎根本不起作用(accountService保持为NULL),所以我猜我没有正确配置。任何帮助将不胜感激!
BaseActionUserAware是需要注入的类:
public class BaseActionUserAware extends BaseAction
{
protected AccountService accountService;
protected String username;
@Override
public String execute() {
super.execute();
// accountService = new AccountServiceImpl();
Object accountID = session.get(SessionProperties.ACCOUNT_ID);
if(null != accountID) {
AccountBean account = accountService.getAccount((int)accountID);
username = account.getUsername();
}
return SUCCESS;
}
public void setAccountService(AccountService accountService) {
this.accountService = accountService;
}
public String getUsername() {
return username;
}
}
...评论的代码表明了我想要完成的事情;我想将accountService注入AccountServiceImpl。
这是我的WEB-INF / applicationContext.xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans 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:aop="http://www.springframework.org/schema/aop"
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.1.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd">
<bean id="accountService" class="hyperbook.service.impl.AccountServiceImpl"/>
<bean id="baseActionUserAware" class="hyperbook.action.BaseActionUserAware">
<property name="accountService" ref="accountService"/>
</bean>
</beans>
...我已经仔细检查了完全限定的类名,这些都是正确的。
我最近在WEB-INF / web.xml文件中添加了以下内容,但它根本没有帮助:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<listener>
<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>
再一次,任何帮助都会非常感激。谢谢!
[编辑]我还应该提一下--BaseActionUserAware从未在Java中的任何地方进行过具体实例化。相反,它专门用于Struts 2动作类的扩展。因此,applicationContext.xml中的baseActionUserAware定义可能完全错误/不需要。我对Spring还不太了解。
答案 0 :(得分:1)
你需要使用Struts 2 Spring插件,否则Spring不知道它应该对S2动作做任何事情。一旦你删除了S2插件(使用Maven,所以其他依赖项自动生成),你基本上在配置Spring上下文加载器监听器后完成了。
您不需要在Spring配置文件中定义您的操作,但可能。您是否需要取决于您的布线方式,例如,如果您按名称自动布线,则可以跳过它。