博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
在Listener、Filter、Servlet中调用 spring 使用注解定义的bean
阅读量:4048 次
发布时间:2019-05-25

本文共 5507 字,大约阅读时间需要 18 分钟。

1.背景

    ServletContext,是一个全局的储存信息的空间,服务器开始建立,服务器关闭销毁。request,每次请求一个;session,一个会话一个;而servletContext,所有用户共用一个。

    ServletContext维护着一个服务器中的一个特定URL名字空间(比如,/myapplication)下的所有Servlet,Filter,JSP,JavaBean等Web部件的集合。

    也就是说Servlet和Filter并不是由Spring ApplicationContext维护的,所以使用autowire注解来进行注入会产生问题。

一般都是通过下面这个方法解决

WebApplicationContext springContext = WebApplicationContextUtils.getWebApplicationContext(servletContextEvent.getServletContext());

  

2.准备工作

准备一个由Spring ApplicationContext维护Bean,分别在Listener、Filter和Servlet中调用其中的方法。

 

import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.stereotype.Component;@Component("springBean")public class SpringBean {    private static final Logger logger = LoggerFactory.getLogger(SpringBean.class);    public void listener() {        logger.info("listener use spring bean");    }    public void servlet() {        logger.info("servlet use spring bean");    }    public void filter() {        logger.info("filter use spring bean");    }}

 

 

 

2.Listener

1.web.xml

com.gqshao.spring.listener.MyListener

 

 

 

2.MyListener

package com.gqshao.spring.listener;import com.gqshao.spring.bean.SpringBean;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.web.context.WebApplicationContext;import org.springframework.web.context.support.WebApplicationContextUtils;import javax.servlet.ServletContextEvent;import javax.servlet.ServletContextListener;/** * 功能说明:测试自定义Listener使用spring使用注解定义的bean */public class MyListener implements ServletContextListener {    private static final Logger logger = LoggerFactory.getLogger(MyListener.class);    @Override    public void contextInitialized(ServletContextEvent event) {        WebApplicationContext springContext = WebApplicationContextUtils.getWebApplicationContext(event.getServletContext());        SpringBean bean = (SpringBean) springContext.getBean("springBean");        bean.listener();    }    @Override    public void contextDestroyed(ServletContextEvent sce) {        logger.info("MyListener contextDestroyed");    }}

 

 

3.Filter

针对Filter,Spring提供了DelegatingFilterProxy解决

 

1.web.xml

MyFilter
org.springframework.web.filter.DelegatingFilterProxy
targetBeanName
myFilter
MyFilter
/*
REQUEST
FORWARD

 

2.applicationContext.xml

 

3.MyFilter

package com.gqshao.spring.filter;import com.gqshao.spring.bean.SpringBean;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.beans.factory.annotation.Autowired;import javax.servlet.*;import java.io.IOException;public class MyFilter implements Filter {    private static final Logger logger = LoggerFactory.getLogger(MyFilter.class);    @Autowired    private SpringBean springBean;    @Override    public void init(FilterConfig filterConfig) throws ServletException {        logger.info("MyFilter init");    }    @Override    public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {        springBean.filter();        filterChain.doFilter(request, response);    }    @Override    public void destroy() {        logger.info("MyFilter destroy");    }}

 

3.Servlet

Servlet我们仿照Spring对Filter的处理写一个DelegatingServletProxy这样的代理Servlet

 

1.web.xml

myServlet
com.gqshao.spring.servlet.DelegatingServletProxy
myServlet
/testservlet

 

2.DelegatingServletProxy

package com.gqshao.spring.servlet;import org.springframework.web.context.WebApplicationContext;import org.springframework.web.context.support.WebApplicationContextUtils;import javax.servlet.*;import java.io.IOException;public class DelegatingServletProxy extends GenericServlet {    private String targetBean;    private Servlet proxy;    @Override    public void service(ServletRequest request, ServletResponse response) throws ServletException,            IOException {        proxy.service(request, response);    }    @Override    public void init() throws ServletException {        this.targetBean = getServletName();        setServletBean();        proxy.init(getServletConfig());    }    private void setServletBean() {        WebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext(getServletContext());        this.proxy = (Servlet) wac.getBean(targetBean);    }}

 

3.MyServlet

package com.gqshao.spring.servlet;import com.gqshao.spring.bean.SpringBean;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Component;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException;import java.io.PrintWriter;@Componentpublic class MyServlet extends HttpServlet {    @Autowired    private SpringBean springBean;    public void service(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        springBean.servlet();        PrintWriter out = response.getWriter();        out.println("

Hello World

"); out.flush(); out.close(); }}

 

4.说明

MyServlet使用Spring ApplicationContext来维护,通过@Component来定义

DelegatingServletProxy 通过web.xml文件中servlet-name中的值在Spring ApplicationContext中查找MyServlet,注意名称一致。

转载地址:http://vqyci.baihongyu.com/

你可能感兴趣的文章
leetcode面试题01.06.字符串压缩,超出时间限制,样例通过31/32
查看>>
机器学习实战、第二章KNN算法详解、AttributeError: ‘dict‘ object has no attribute ‘iteritems‘
查看>>
leetcode 535 TinyURL 的加密与解密 暴力 年轻人不讲武德—shooter7的博客
查看>>
课程设计(毕业设计)—基于机器学习KNN算法手写数字识别系统—计算机专业课程设计(毕业设计)
查看>>
leetcode1792第232场周赛第三题,以及二维数组根据某一列进行排序——优先队列
查看>>
学生网上选课管理系统的设计与实现—计算机类专业课程设计(毕业设计)
查看>>
新建动态web工程项目红叉报错,以及Could not publish server configuration for Tomcat v9.0 Server at localhost.
查看>>
机器学习SVM的车牌识别系统—计算机专业课程设计(毕业设计)
查看>>
leetcode 80. 删除有序数组中的重复项 II
查看>>
课程设计(毕业设计)—学生宿舍管理系统—计算机类专业
查看>>
毕业设计(课程设计)—SpringBoot网上订餐系统的设计与实现—计算机类专业课程设计(毕业设计)
查看>>
毕业设计(课程设计)—个人博客系统(微博)的设计与实现—计算机类专业课程设计(毕业设计)
查看>>
牛客(中兴捧月)—B-切绳子
查看>>
剑指Offer 13.机器人的运动范围——DFS和BFS
查看>>
Java中GUI编程总结—AWT中的Frame容器、panel面板、布局管理
查看>>
剑指offer12.矩阵中的路径—DFS+剪枝
查看>>
Java中GUI编程总结—事件监听、TextField监听、画笔、(鼠标、窗口、键盘)监听
查看>>
Java中GUI编程总结—Swing(窗口、面板、弹窗、标签、按钮、列表、文本框)
查看>>
Java中map容器分别根据键key和值value进行排序的总结
查看>>
剑指offer面试题16. 数值的整数次方——快速幂
查看>>