2014-10-08 66 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上下文中的控制器。