2010-11-15 74 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