spring mvc annotation @Inject不起作用

时间:2010-11-15 18:29:27

标签: java spring-mvc

我的app-servlet.xml

中有以下内容
<mvc:annotation-driven />

<context:component-scan base-package="com.merc.myProject.web.controllers"/>
<context:component-scan base-package="com.merc.myProject.web.forms"/>

我的控制器包中的所有内容都被注入,但是form包中的相同内容始终为null。

我的表单看起来像这样

public class SelectDatesForm {

    @Inject IUserService userService;
    .....
}

我的控制器看起来像这样

@Controller
public class SelectDates {

   @Inject IUserService userService;

   .....
}
有人请帮忙

2 个答案:

答案 0 :(得分:4)

<context:component-scan>查找使用@Component@Controller@Service等内容注释的类,并将其配置为bean。如果这些类具有使用@Inject@Resource注入的属性,那么这些属性也将被处理。

但是,如果您的课程没有注释,那么@Inject将不会被处理。这是SelectDatesForm的情况。如果您使用@Component对其进行注释,则应该将其选中。

我在这里要小心一点 - 形式通常不适合Spring bean,因为它们往往是丢失的瞬态对象。

答案 1 :(得分:1)

我猜你的SelectDatesForm是用new手动实例化的,而不是从Spring上下文中获取的。在这种情况下,它不是Spring bean,因此不是依赖注入的主题。

通常,您不需要将依赖项注入手动创建的对象中。如果您确实需要这样做,您有几种选择:

  • 将您的SelectDatesForm声明为原型范围的bean,并从Spring上下文中获取它的新实例,而不是使用new创建它:

    @Component @Scope("prototype")
    public class SelectDatesForm { ... }
    

    当你需要获得它的新实例时:

    SelectDatesForm newForm = applicationContext.getBean(SelectDatesForm.class);
    

    但是,这种方法将您的代码与Spring的ApplicationContext相结合。

  • 如果您无法控制SelectDatesForm的实例化(即它发生在您的代码之外),您可以使用@Configurable

  • 您也可以手动方便自动装配使用new创建的对象:

    SelectDatesForm newForm = new SelectDatesForm();
    applicationContext.getAutowireCapableBeanFactory().autowireBean(newForm);