spring mvc中如何在servlet里注入service

wangaowell 发布于 2014/06/26 10:47
阅读 6K+
收藏 1

spring mvc中,controller里面注入了service,service里面注入mapper都已经成功了,但是现在因为一些原因,需要初始化initServlet,并在initServlet里面实现doPost方法,想在initServlet中注入service,

InitServlet.java的部分代码:

    @Autowired

    private XXXService xxxService;

application-context.xml的部分配置:

    <context:component-scan base-package="com.xxx.xxx.service" />

    <context:component-scan base-package="com.xxx.xxx.servlet" />

但是现在xxxSercice在InitServlet总是null,求指导。

加载中
0
抢小孩糖吃
抢小孩糖吃

其他的servlet在spring中只能通过listener进行启动与调用,相当于独立与spring的mvc扫描架构进行使用,举例

web.xml

<web-app version="2.4"
	xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
	http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

	<display-name>Spring MVC Application</display-name>

    <servlet>
		<servlet-name>mvc-dispatcher</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
	</servlet>

	<servlet-mapping>
		<servlet-name>mvc-dispatcher</servlet-name>
		<url-pattern>/</url-pattern>
	</servlet-mapping>

    <!-- using the golab thread running -->
    <listener>
        <listener-class>com.hava.utils.ThreadServletContextListener</listener-class>
    </listener>
        </web-app>



Listener.java

package com.hava.utils;

import com.hava.Thread.FileSynchronous;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;


/**
 * Created by hava on 2014/5/13.
 * Only start run the thread and when the webservice stop destory
 */
public class ThreadServletContextListener implements ServletContextListener {

    FileSynchronous fileSync;

    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
        System.out.println("ServletContextListener Init...");

        //Some init code not relevant, omitted for clarity
        fileSync = new FileSynchronous(servletContextEvent.getServletContext());
        fileSync.start();// run();
    }

    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {
        System.out.println("ServletContextListener Destroy...");
        fileSync.stop();
    }
}



至于如何用private XXXService xxxService;

我只知道一种方式,通过代码直接加载另外一份Service。如何只加载一次Service这个还真不清楚,求楼下解释。

dreamers
dreamers
获取Spring的BeanFactory,获取通过它来get就可以了。你觉得呢?
0
逝水fox
逝水fox

不能使用标准的Servlet,改为实现org.springframework.web.HttpRequestHandler接口

/**
 * 打开文档的处理方法
 * 
 * @author Chen Rui
 */
public class OfficeOpenServlet implements HttpRequestHandler {
	/* ----- ----- ----- ----- 其他方法 ----- ----- ----- ----- */
	@Override
	public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException,
			IOException {
		// 原Servlet service方法的处理
	}
}
在Spring配置文件中配置这个Bean,并在web.xml中用监听器org.springframework.web.context.ContextLoaderListener创建WebApplicationContext

<!-- application-context.xml -->
<bean name="officeOpenServlet" class="org.fox.servlet.OfficeOpenServlet"/>
<!-- web.xml -->
<context-param>
	<param-name>contextConfigLocation</param-name>
	<param-value>/WEB-INF/config/application-context.xml</param-value>
</context-param>

<listener>
	<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
最后一步是在web.xml配置一个代理servlet,他会将自己接受的请求交给WebApplicationContext中与这个Servlet同名的bean处理(注意<servlet-name>配置要和上面的bean的name相同),这个Bean可以尽情使用Spring的功能,自动注入也好,容器感知也好,AOP也好:

<servlet>
	<servlet-name>officeOpenServlet</servlet-name> 
	<servlet-class>org.springframework.web.context.support.HttpRequestHandlerServlet</servlet-class>
</servlet>



wangaowell
wangaowell
回复 @逝水fox : 这种需求可以通过spring mvc实现吗?
逝水fox
逝水fox
回复 @wangaowell : 这种需求为什么不用Spring MVC而用Servlet呢?
wangaowell
wangaowell
回复 @逝水fox : 哦。我现在是做微信公众平台的接口,在initServlet里面init方法设置为自动启动,doGet方法是用来校验请求是否来自于微信服务器,而doPost方法是用来接收微信服务器的请求。这个在实现HttpRequestHandler的servlet里面应该怎么写?
逝水fox
逝水fox
回复 @wangaowell : doGet或post需要自己判断request的属性来实现,至于init方法你可以用Spring Bean的生命周期回调来实现,配了注解驱动的话用@PostConstruct注解方法就好,bean创建后回自动执行
wangaowell
wangaowell
配置成功了,但是有两个问题: 1.这个servlet能不能实现HttpServlet中的init方法,就是当tomcat启动后自动实现init初始化方法 2.handleRequest中能不能实现doGet和doPost两个方法。
0
逝水fox
逝水fox
如果这样,那就用原Serlvet,配置ContextLoaderListener监听器,在Servlet的方法中使用
WebApplicationContextUtils的getRequiredWebApplicationContext()方法获取上下文中的ApplicationContext,进而通过getBean()获取到Spring的Bean,不过这过程就需要你自己编码手工实现了
wangaowell
wangaowell
好滴。
返回顶部
顶部