2010-11-15 96 views
0

在我的应用程序-servlet.xml中,我有以下Spring MVC的注解@注入不起作用

<mvc:annotation-driven /> 

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

什么都我在我的控制器封装被注入,但在形式包装同样的事情总是空。

我的形式看起来是这样的

public class SelectDatesForm { 

    @Inject IUserService userService; 
    ..... 
} 

我的控制器看起来像这样

@Controller 
public class SelectDates { 

    @Inject IUserService userService; 

    ..... 
} 

请人帮忙

回答

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); 
    
+0

非常感谢您为解释所有信息和麻烦。 – user373201 2010-11-15 21:33:26

4

<context:component-scan>寻找的东西像@Component@Controller@Service注解类,等等,并将它们配置为bean。如果这些类别的属性注入了@Inject@Resource,那么这些属性也将被处理。

但是,如果您的课程没有注释开始,那么@Inject将不会被处理。这是SelectDatesForm的情况。如果你用@Component对此进行注释,它应该被拾取。

虽然这里我会小心一点,因为Spring bean通常不是很好的候选对象,因为它们往往是不需要的,暂时的对象。

+0

感谢您的回复。我试图把@Service以及@Component。一次只有一个,但我得到相同的空指针excite。因为注射没有发生。 – user373201 2010-11-15 19:10:30