我正在使用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上下文中。