不使用@Autowire的Spring + Spring MVC依赖注入

时间:2014-10-08 14:34:08

标签: spring spring-mvc dependency-injection

我正在使用Spring和Spring MVC构建应用程序。对我来说,使用@Autowired不是一个选项(是一项要求)。

我已经构建了一个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-dispatcher-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上,我定义了我的Spring bean,例如本案例中的我的服务&#34; OneService.java&#34;

我有一个控制器:

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

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

我想在ApplicationContext.xml文件中定义注入OneService。 我已经尝试了几种方法,但是我无法使它工作,总是在控制器内部使用我的服务时出现NullPointerException。

有没有办法在这个mvc servlet中使用applicationContext.xml中定义的bean?

谢谢大家的时间!

[UPDATE]

如果我在servlet中定义了所有的applicatonContext,我就无法使用它。有没有办法让servlet上下文成为应用程序conntext的子项才能使用应用程序上下文bean?

由于

1 个答案:

答案 0 :(得分:0)

应用程序上下文已经是&#34;父亲&#34;所以在其中定义的bean可用于其子节点中定义的bean。但是如果需要,您可以在应用程序上下文中定义。 问题可能是您尝试注入服务的方式。

如果将@Autowired添加到您的服务中,它将起作用,因为该bean在您的控制器中可用,但如果您不想使用注释,则需要在xml上下文中显式创建和注入bean。 首先,您需要在控制器中添加一个setter:

<form role="form" name="createProjectForm" class="form-validation">
    <div class="form-group">
        <label class="control-label text-center center-block" for="project.name">
                Name Your Project
        </label>
        <div class="input-icon right">
            <input type="text" placeholder="type here" name="project.name"
                ng-model="project.name" required="required" class="form-control" add-icon-element/>
        </div>
    </div>
<form>

然后在你的应用程序上下文中你会这样做:

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

您仍然可以执行此操作并将服务声明保留在应用程序上下文中,并将控制器保留在servlet上下文中。