Spring+Spring MVC依赖项注入,而不使用@Autowire



我正在使用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上,我定义了我的Springbean,比如在本例中的Services;OneService.java";

我有一个控制器作为:

@Controller
@RequestMapping("/main")
public class MainController {
    private OneService oneService;
    //getters and setters
    ...
}

我想在哪里注入在applicationContext.xml文件中定义的OneService。我尝试了几种方法,但都无法使其正常工作,在控制器中使用我的服务时总是会得到一个NullPointerException。

有什么方法可以在这个mvc servlet中使用applicationContext.xml中定义的bean吗?

[更新]

如果我在servlet中定义了所有的applicationContext,我就无法让它工作。是否有任何方法可以使servlet上下文成为应用程序上下文的子级,以便能够使用应用程序上下文bean?

应用程序上下文已经是"父",因此在中定义的bean可用于在其子级中定义的beans。但是,如果需要,可以在应用程序上下文中定义这两种情况。问题可能在于如何尝试注入服务。

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

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上下文中。

最新更新