本文讲解的知识点是基于Springboot 2.1.5.RELEASE版本。
之前我们介绍了Springboot如何通过注解方式实现Filter、Servlet、Listener组件的功能,除此之外还有另一种通过创建RegistrationBean
相应子类,借助@Bean
注解将自定义组件注册到容器中的方法,一起来看下。
Springboot提供了三个RegistrationBean
的子类用于注册Filter、Servlet、Listener组件:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0modelVersion>
<groupId>com.sdsjgroupId>
<artifactId>springbootartifactId>
<version>0.0.1-SNAPSHOTversion>
<packaging>jarpackaging>
<name>springbootname>
<description>Demo project for Spring Bootdescription>
<parent>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-parentartifactId>
<version>2.1.5.RELEASEversion>
parent>
<properties>
<project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8project.reporting.outputEncoding>
<java.version>1.8java.version>
properties>
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-testartifactId>
<scope>testscope>
dependency>
dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-maven-pluginartifactId>
plugin>
plugins>
build>
project>
为了方便,我将启动类和控制器放在一起,如下:
package com.sdsj.springboot;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@SpringBootApplication
@RestController
public class SpringbootApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootApplication.class, args);
}
@RequestMapping("/")
public String index() {
System.out.println("This is index page");
return "Welcome!";
}
}
在启动类上添加了两个注解:@SpringBootApplication
和@RestController
。
package com.sdsj.springboot.config;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
/**
* 过滤器
*
* @author zjhuang
* @create 2019/6/4 15:21
**/
public class SecondFilter implements Filter {
private Logger log = LoggerFactory.getLogger(this.getClass());
@Override
public void init(FilterConfig filterConfig) throws ServletException {
log.info("second filter init, filter name: " + filterConfig.getFilterName());
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
log.info("second filter uri: " + ((HttpServletRequest) servletRequest).getServletPath());
filterChain.doFilter(servletRequest, servletResponse);
}
@Override
public void destroy() {
log.info("second filter destroy");
}
}
package com.sdsj.springboot.config;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.servlet.ServletConfig;
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;
/**
* 自定义Servlet
*
* @author zjhuang
* @create 2019/6/4 17:13
**/
public class SecondServlet extends HttpServlet {
private Logger log = LoggerFactory.getLogger(this.getClass());
@Override
public void init(ServletConfig servletConfig) throws ServletException {
log.info("second servlet init, servlet name: " + servletConfig.getServletName());
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
log.info("second servlet uri: " + req.getServletPath());
PrintWriter out = resp.getWriter();
out.write("second servlet is running");
out.flush();
}
@Override
public void destroy() {
log.info("second servlet destroy");
}
}
package com.sdsj.springboot.config;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.http.HttpServletRequest;
/**
* 监听器
*
* @author zjhuang
* @create 2019/6/4 15:21
**/
public class SecondListener implements ServletRequestListener {
private Logger log = LoggerFactory.getLogger(this.getClass());
@Override
public void requestDestroyed(ServletRequestEvent sre) {
HttpServletRequest request = (HttpServletRequest) sre.getServletRequest();
log.info("second listener has sent response, uri: " + request.getServletPath());
}
@Override
public void requestInitialized(ServletRequestEvent sre) {
HttpServletRequest request = (HttpServletRequest) sre.getServletRequest();
log.info("second listener has received request, uri: " + request.getServletPath());
}
}
package com.sdsj.springboot.config;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletListenerRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.servlet.Filter;
import javax.servlet.Servlet;
import java.util.EventListener;
/**
* 全局配置类
*
* @author zjhuang
* @create 2019/6/5 17:39
**/
@Configuration
public class Config {
/**
* 注册一个Filter
*
* @return FilterRegistrationBean
*/
@Bean
public FilterRegistrationBean registerFilter() {
// 创建Filter注册Bean
FilterRegistrationBean<Filter> registration = new FilterRegistrationBean<>();
// 创建自定义的Filter对象
SecondFilter filter = new SecondFilter();
// 注册Filter
registration.setFilter(filter);
// 设置Filter名称
registration.setName("second_filter");
// 设置Fliter匹配规则
registration.addUrlPatterns("/*");
// 设置排序,在存在多个Filter实例的情况下确定Filter的执行顺序
registration.setOrder(1);
return registration;
}
/**
* 注册一个Servlet
*
* @return ServletRegistrationBean
*/
@Bean
public ServletRegistrationBean registerServlet() {
// 创建Servlet注册Bean
ServletRegistrationBean<Servlet> registration = new ServletRegistrationBean<>();
// 创建自定义的Servlet对象
SecondServlet servlet = new SecondServlet();
// 注册Servlet
registration.setServlet(servlet);
// 设置Servlet名称
registration.setName("second_servlet");
// 设置Servlet配置规则
registration.addUrlMappings("/second_servlet");
// 设置加载参数
registration.setLoadOnStartup(1);
return registration;
}
/**
* 注册一个Listener
*
* @return ServletListenerRegistrationBean
*/
@Bean
public ServletListenerRegistrationBean registerListener() {
// 创建Listener注册Bean
ServletListenerRegistrationBean<EventListener> registration = new ServletListenerRegistrationBean<>();
// 创建自定义的Listener对象
SecondListener listener = new SecondListener();
// 注册Listener
registration.setListener(listener);
// 设置排序,在存在多个Listener实例的情况下确定Listener的执行顺序
registration.setOrder(1);
return registration;
}
}