2014-10-08 89 views
0

我正在使用Spring和Spring MVC構建應用程序。對於我來說,使用@Autowired不是一個選項(是一項要求)。未使用@Autowire的Spring + Spring MVC依賴注入

我建立一個像web.xml文件:

<!-- Spring context --> 
<context-param> 
<param-name>contextConfigLocation</param-name> 
    <param-value>/WEB-INF/applicationContext.xml</param-value> 
</context-param> 
<!-- Creates the Spring Container shared by all Servlets and Filters --> 
<listener> 
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
</listener> 

<!-- Spring MVC --> 
<servlet> 
    <servlet-name>mvc-dispatcher</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <init-param> 
     <param-name>namespace</param-name> 
     <param-value>mvc-dispatcher-context</param-value> 
    </init-param> 
</servlet> 
<servlet-mapping> 
    <servlet-name>mvc-dispatcher</servlet-name> 
    <url-pattern>/</url-pattern> 
</servlet-mapping> 

所以我加載Spring上下文和Spring MVC的Servlet。

我的MVC-調度-context.xml文件看起來像:

<beans ...> 

    <mvc:annotation-driven /> 

    <context:component-scan base-package="com.pacage.controller"/> 

    <mvc:resources mapping="/resources/**" location="/WEB-INF/static/" /> 

    <bean 
    class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
    <property name="prefix"> 
     <value>/WEB-INF/pages/</value> 
    </property> 
    <property name="suffix"> 
     <value>.jsp</value> 
    </property> 
    </bean> 
</beans> 

所以我可以在我的控制器使用註解@Controller ...

而且在我的applicationContext.xml我有我的春天豆類定義,比如我在這種情況下,服務「OneService.java」

我有一個控制器:

@Controller 
@RequestMapping("/main") 
public class MainController { 

    private OneService oneService; 
    //getters and setters 
    ... 
} 

我想要在applicationContext.xml文件中定義注入OneService的位置。 我嘗試了幾種方法,但我無法得到它的工作,總是在控制器內使用我的服務時得到一個NullPointerException。

有沒有什麼方法可以使用此mvc servlet中的applicationContext.xml中定義的bean?

謝謝你們所有的時間!

[更新]

如果我定義我的servlet裏面我所有的applicatonContext我不能讓它工作。有沒有什麼辦法讓servlet上下文成爲應用程序連接的子節點,只是爲了能夠使用應用程序上下文bean?

感謝

+0

「是要求」嗎?如果您使用的是@ @ Controller,那麼您已經使用了特定於Spring的註釋,但是@ @ Inject'當然是一個可以接受的選擇。 – chrylis 2014-10-08 14:41:44

+0

我可以不使用註釋來做到這一點嗎? – 2014-10-08 14:45:18

+0

理論上是的,但你也可以用C編寫應用程序。註釋是Web開發中的最佳實踐,並且有很好的理由。 – chrylis 2014-10-08 14:49:36

回答

0

應用方面已經是「父親」如此定義豆類有提供給其子定義的bean。但是,如果需要,您可以在應用程序上下文中定義兩者。 問題可能是您如何嘗試注入服務。

如果你添加@Autowired給你服務,它將工作,因爲這個bean在你的控制器中是可用的,但是如果你不想使用註釋,那麼你需要在你的xml上下文中顯式地創建和注入bean。 首先,你需要在你的控制器中添加一個setter:

public void setOneService(OneService oneService) { 
    this.oneService = oneService; 
} 

然後在你的應用環境下,你會怎麼做:

<bean id="mainController" class="com.package.controller.MainController"> 
    <property name="oneService" ref="oneService" /> 
</bean> 
<bean id="oneService" class="com.package.service.OneService"> 
</bean> 

,您仍然可以做到這一點,保持服務的聲明在應用程序上下文servlet上下文中的控制器。